From a3096ac87b6bfa7bb2d88847ef16ad0b992601c9 Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Sun, 14 May 2023 03:23:23 -0400 Subject: [PATCH] [WIP] Newfood: Part 1 of 4 (#8748) * https://github.com/tgstation/tgstation/pull/49192 * https://github.com/tgstation/tgstation/pull/53047/files * fixerino * food_storage component * https://github.com/tgstation/tgstation/pull/53316 * https://github.com/tgstation/tgstation/pull/53225 * https://github.com/tgstation/tgstation/pull/53574 * 515 compat * fix maps * https://github.com/tgstation/tgstation/pull/69095 * bread slicing * https://github.com/tgstation/tgstation/pull/71449 * fixes * finger food & edible fixes * https://github.com/tgstation/tgstation/pull/66257 * FIX THIS SHIT * accidental_consumption * fix trash runtime * fixes some runtimes * microwavable * https://github.com/tgstation/tgstation/pull/55150 * 515 compat * Revert "515 compat" This reverts commit 5681ca6cf6f8bcc187ceb4c263407631b461659b. * Revert "https://github.com/tgstation/tgstation/pull/55150" This reverts commit aadbe1c392ade3caa4f1bcaf56abd8ea51dbd12d. * Revert "microwavable" This reverts commit 3b2f465d2cb79675e49dde08f45dcc694be29595. * fix exploit with pasta --- .../LavaRuins/lavaland_surface_pizzaparty.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 22 + code/__DEFINES/food.dm | 79 +-- code/__DEFINES/is_helpers.dm | 5 + code/__DEFINES/processing.dm | 3 + code/__DEFINES/reagents.dm | 22 +- code/__DEFINES/tools.dm | 1 + code/__HELPERS/string_assoc_lists.dm | 21 +- code/__HELPERS/string_lists.dm | 14 + code/datums/components/edible.dm | 256 -------- code/datums/components/food/edible.dm | 452 +++++++++++++ code/datums/components/food/food_storage.dm | 204 ++++++ code/datums/elements/food/dunkable.dm | 34 + code/datums/elements/food/food_trash.dm | 40 ++ code/datums/elements/food/processable.dm | 47 ++ code/datums/materials/_material.dm | 9 + code/datums/traits/negative.dm | 2 +- code/game/atoms.dm | 94 ++- code/game/objects/items.dm | 92 +++ code/game/objects/items/food/_food.dm | 67 ++ code/game/objects/items/food/bread.dm | 412 ++++++++++++ code/game/objects/items/food/cake.dm | 614 ++++++++++++++++++ code/game/objects/items/food/spaghetti.dm | 137 ++++ code/game/objects/items/kitchen.dm | 1 + code/game/objects/items/storage/bags.dm | 14 +- code/game/objects/items/storage/belt.dm | 2 +- code/modules/cargo/bounties/chef.dm | 4 +- code/modules/food_and_drinks/drinks/drinks.dm | 2 +- .../food_and_drinks/food/customizables.dm | 60 +- code/modules/food_and_drinks/food/snacks.dm | 36 +- .../food_and_drinks/food/snacks/dough.dm | 4 +- .../food_and_drinks/food/snacks_bread.dm | 302 --------- .../food_and_drinks/food/snacks_cake.dm | 431 ------------ .../food_and_drinks/food/snacks_egg.dm | 7 +- .../food_and_drinks/food/snacks_frozen.dm | 10 +- .../food_and_drinks/food/snacks_meat.dm | 7 + .../food_and_drinks/food/snacks_other.dm | 36 +- .../food_and_drinks/food/snacks_pastry.dm | 29 +- .../food/snacks_sandwichtoast.dm | 4 + .../food_and_drinks/food/snacks_spaghetti.dm | 106 --- .../food_and_drinks/food/snacks_vend.dm | 9 + .../kitchen_machinery/deep_fryer.dm | 8 +- .../kitchen_machinery/icecream_vat.dm | 5 +- .../recipes/processor_recipes.dm | 2 +- .../recipes/tablecraft/recipes_bread.dm | 56 +- .../recipes/tablecraft/recipes_cake.dm | 97 +-- .../recipes/tablecraft/recipes_egg.dm | 2 +- .../recipes/tablecraft/recipes_misc.dm | 10 +- .../recipes/tablecraft/recipes_pastry.dm | 4 +- .../recipes/tablecraft/recipes_sandwich.dm | 10 +- .../recipes/tablecraft/recipes_spaghetti.dm | 71 +- code/modules/holiday/easter.dm | 23 +- .../mob/living/simple_animal/friendly/cat.dm | 22 +- .../chemistry/reagents/food_reagents.dm | 5 +- .../chemistry/recipes/slime_extracts.dm | 2 +- .../reagents/reagent_containers/glass.dm | 1 + .../xenobiology/crossbreeding/charged.dm | 2 +- code/modules/unit_tests/create_and_destroy.dm | 2 +- shiptest.dme | 34 +- 59 files changed, 2625 insertions(+), 1424 deletions(-) create mode 100644 code/__DEFINES/processing.dm delete mode 100644 code/datums/components/edible.dm create mode 100644 code/datums/components/food/edible.dm create mode 100644 code/datums/components/food/food_storage.dm create mode 100644 code/datums/elements/food/dunkable.dm create mode 100644 code/datums/elements/food/food_trash.dm create mode 100644 code/datums/elements/food/processable.dm create mode 100644 code/game/objects/items/food/_food.dm create mode 100644 code/game/objects/items/food/bread.dm create mode 100644 code/game/objects/items/food/cake.dm create mode 100644 code/game/objects/items/food/spaghetti.dm delete mode 100644 code/modules/food_and_drinks/food/snacks_bread.dm delete mode 100644 code/modules/food_and_drinks/food/snacks_cake.dm delete mode 100644 code/modules/food_and_drinks/food/snacks_spaghetti.dm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index d035e25f5cbd..330311a52692 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -205,7 +205,7 @@ /area/ruin/unpowered) "F" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/food/snacks/store/cake/birthday, +/obj/item/food/cake/birthday, /turf/open/floor/wood{ initial_gas_mix = "o2=14;n2=5;co2=13;TEMP=300" }, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 209466a1b2ef..817e02e67f2b 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -11634,6 +11634,28 @@ /obj/effect/turf_decal/corner/transparent/neutral{ dir = 8 }, +/obj/merge_conflict_marker{ + name = "---Merge Conflict Marker---",desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." + }, +/obj/structure/closet/secure_closet/freezer/meat/open, +/obj/item/reagent_containers/food/snacks/meat/slab/bear, +/obj/item/reagent_containers/food/snacks/meat/slab/bear, +/obj/item/reagent_containers/food/snacks/meat/slab/bear, +/obj/item/reagent_containers/food/snacks/meat/slab/bear, +/obj/item/reagent_containers/food/snacks/meat/slab/goliath, +/obj/item/reagent_containers/food/snacks/meat/slab/goliath, +/obj/item/reagent_containers/food/snacks/meat/slab/goliath, +/obj/item/reagent_containers/food/snacks/meat/slab/goliath, +/obj/item/reagent_containers/food/snacks/meat/slab/xeno, +/obj/item/reagent_containers/food/snacks/meat/slab/xeno, +/obj/item/reagent_containers/food/snacks/meat/slab/xeno, +/obj/item/reagent_containers/food/snacks/meat/slab/xeno, +/obj/item/food/spaghetti/raw, +/obj/item/food/spaghetti/raw, +/obj/item/reagent_containers/food/snacks/meat/rawcutlet, +/obj/item/reagent_containers/food/snacks/meat/rawcutlet, +/obj/item/reagent_containers/food/snacks/meat/rawcutlet, +/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/tdome/tdomeobserve) "miW" = ( diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index f2b6a8fd196d..e1fb3fbf55f7 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -1,54 +1,35 @@ -#define MEAT (1<<0) -#define VEGETABLES (1<<1) -#define RAW (1<<2) -#define JUNKFOOD (1<<3) -#define GRAIN (1<<4) -#define FRUIT (1<<5) -#define DAIRY (1<<6) -#define FRIED (1<<7) -#define ALCOHOL (1<<8) -#define SUGAR (1<<9) -#define GROSS (1<<10) -#define TOXIC (1<<11) -#define PINEAPPLE (1<<12) -#define BREAKFAST (1<<13) -#define CLOTH (1<<14) -#define GRILLED (1<<15) -/*#define NUTS (1<<16) -#define SEAFOOD (1<<17) -#define ORANGES (1<<18) -#define BUGS (1<<19)*/ -#define GORE (1<<20) +#define MEAT (1<<0) +#define VEGETABLES (1<<1) +#define RAW (1<<2) +#define JUNKFOOD (1<<3) +#define GRAIN (1<<4) +#define FRUIT (1<<5) +#define DAIRY (1<<6) +#define FRIED (1<<7) +#define ALCOHOL (1<<8) +#define SUGAR (1<<9) +#define GROSS (1<<10) +#define TOXIC (1<<11) +#define PINEAPPLE (1<<12) +#define BREAKFAST (1<<13) +#define CLOTH (1<<14) -/// IC meaning (more or less) for food flags -#define FOOD_FLAGS_IC list( \ - "Meat", \ - "Vegetables", \ - "Raw food", \ - "Junk food", \ - "Grain", \ - "Fruits", \ - "Dairy products", \ - "Fried food", \ - "Alcohol", \ - "Sugary food", \ - "Gross food", \ - "Toxic food", \ - "Pineapples", \ - "Breakfast food", \ - "Clothing", \ - "Nuts", \ - "Seafood", \ - "Oranges", \ - "Bugs", \ -) - -#define DRINK_NICE 1 -#define DRINK_GOOD 2 -#define DRINK_VERYGOOD 3 -#define DRINK_FANTASTIC 4 -#define FOOD_AMAZING 5 +#define DRINK_BAD 1 +#define DRINK_NICE 2 +#define DRINK_GOOD 3 +#define DRINK_VERYGOOD 4 +#define DRINK_FANTASTIC 5 +/// Food is "in a container", not in a code sense, but in a literal sense (canned foods) #define FOOD_IN_CONTAINER (1<<0) +/// Finger food can be eaten while walking / running around +#define FOOD_FINGER_FOOD (1<<1) #define STOP_SERVING_BREAKFAST (15 MINUTES) + +///Amount of reagents you start with on crafted food excluding the used parts +#define CRAFTED_FOOD_BASE_REAGENT_MODIFIER 0.7 +///Modifier of reagents you get when crafting food from the parts used +#define CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER 0.5 + +#define IS_EDIBLE(O) (O.GetComponent(/datum/component/edible)) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index c0a4d30aba8b..46a675eab844 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -228,6 +228,11 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) +/// isnum() returns TRUE for NaN. Also, NaN != NaN. Checkmate, BYOND. +#define isnan(x) ( (x) != (x) ) + +#define isinf(x) (isnum((x)) && (((x) == SYSTEM_TYPE_INFINITY) || ((x) == -SYSTEM_TYPE_INFINITY))) + #define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) #define isbook(O) (is_type_in_typecache(O, GLOB.book_types)) diff --git a/code/__DEFINES/processing.dm b/code/__DEFINES/processing.dm new file mode 100644 index 000000000000..905c03830d51 --- /dev/null +++ b/code/__DEFINES/processing.dm @@ -0,0 +1,3 @@ +#define TOOL_PROCESSING_RESULT "result" +#define TOOL_PROCESSING_AMOUNT "amount" +#define TOOL_PROCESSING_TIME "time" diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index c66d3f34c1ad..9816ae5ac388 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -2,19 +2,21 @@ #define LIQUID 2 #define GAS 3 -#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. -#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes. +#define INJECTABLE (1<<0) // Makes it possible to add reagents through droppers and syringes. +#define DRAWABLE (1<<1) // Makes it possible to remove reagents through syringes. -#define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container. -#define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container. -#define DUNKABLE (1<<4) // Allows items to be dunked into this container for transfering reagents. Used in conjunction with the dunkable component. +#define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container. +#define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container. +#define DUNKABLE (1<<4) // Allows items to be dunked into this container for transfering reagents. Used in conjunction with the dunkable component. -#define TRANSPARENT (1<<5) // Used on containers which you want to be able to see the reagents off. -#define AMOUNT_VISIBLE (1<<6) // For non-transparent containers that still have the general amount of reagents in them visible. -#define NO_REACT (1<<7) // Applied to a reagent holder, the contents will not react with each other. +#define TRANSPARENT (1<<5) // Used on containers which you want to be able to see the reagents off. +#define AMOUNT_VISIBLE (1<<6) // For non-transparent containers that still have the general amount of reagents in them visible. +#define NO_REACT (1<<7) // Applied to a reagent holder, the contents will not react with each other. -// Is an open container for all intents and purposes. -#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) +#define ABSOLUTELY_GRINDABLE (1<<8) //! used in 'All-In-One Grinder' that it can grind anything if it has this bitflag + +/// Is an open container for all intents and purposes. +#define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) #define TOUCH 1 // splashing diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 320648170b44..3d4cdae52323 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -14,6 +14,7 @@ #define TOOL_DRILL "drill" #define TOOL_SCALPEL "scalpel" #define TOOL_SAW "saw" +#define TOOL_KNIFE "knife" // If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, // tool sound is only played when op is started. If not, it's played twice. diff --git a/code/__HELPERS/string_assoc_lists.dm b/code/__HELPERS/string_assoc_lists.dm index cded3a349691..e269da7da5eb 100644 --- a/code/__HELPERS/string_assoc_lists.dm +++ b/code/__HELPERS/string_assoc_lists.dm @@ -1,17 +1,18 @@ GLOBAL_LIST_EMPTY(string_assoc_lists) + /** - * Caches associative lists with non-numeric stringify-able index keys and stringify-able values (text/typepath -> text/path/number). - */ + * Caches associative lists with non-numeric stringify-able index keys and stringify-able values (text/typepath -> text/path/number). + */ /datum/proc/string_assoc_list(list/values) - var/list/string_id = list() - for(var/val in values) - string_id += "[val]_[values[val]]" - string_id = string_id.Join("-") + var/list/string_id = list() + for(var/val in values) + string_id += "[val]_[values[val]]" + string_id.Join("-") - . = GLOB.string_assoc_lists[string_id] + . = GLOB.string_assoc_lists[string_id] - if(.) - return + if(.) + return - return GLOB.string_assoc_lists[string_id] = values + return GLOB.string_assoc_lists[string_id] = values diff --git a/code/__HELPERS/string_lists.dm b/code/__HELPERS/string_lists.dm index 5b3646def6e1..5ace769133eb 100644 --- a/code/__HELPERS/string_lists.dm +++ b/code/__HELPERS/string_lists.dm @@ -1,5 +1,19 @@ GLOBAL_LIST_EMPTY(string_lists) +/** + * Caches lists with non-numeric stringify-able values (text or typepath). + */ +/datum/proc/string_list(list/values) + var/string_id = values.Join("-") + + . = GLOB.string_lists[string_id] + + if(.) + return + + return GLOB.string_lists[string_id] = values +GLOBAL_LIST_EMPTY(string_lists) + /** * Caches lists with non-numeric stringify-able values (text or typepath). */ diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm deleted file mode 100644 index 3a047d082868..000000000000 --- a/code/datums/components/edible.dm +++ /dev/null @@ -1,256 +0,0 @@ -/*! - -This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items). -These items take a specific time to eat, and can do most of the things our original food items could. - -Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else: - Components: - Drying component (jerky etc) - Customizable component (custom pizzas etc) - Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.) - Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents) - - Misc: - Something for cakes (You can store things inside) - -*/ -/datum/component/edible - ///Amount of reagents taken per bite - var/bite_consumption = 2 - ///Amount of bites taken so far - var/bitecount = 0 - ///Flags for food - var/food_flags = NONE - ///Bitfield of the types of this food - var/foodtypes = NONE - ///Amount of seconds it takes to eat this food - var/eat_time = 30 - ///Defines how much it lowers someones satiety (Need to eat, essentialy) - var/junkiness = 0 - ///Message to send when eating - var/list/eatverbs - ///Callback to be ran for when you take a bite of something - var/datum/callback/after_eat - ///Last time we checked for food likes - var/last_check_time - -/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, datum/callback/after_eat) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine)) - RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal)) - if(isitem(parent)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(UseFromHand)) - else if(isturf(parent)) - RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(TryToEatTurf)) - - src.bite_consumption = bite_consumption - src.food_flags = food_flags - src.foodtypes = foodtypes - src.eat_time = eat_time - src.eatverbs = eatverbs - src.junkiness = junkiness - src.after_eat = after_eat - - var/atom/owner = parent - - owner.create_reagents(volume, INJECTABLE) - - if(initial_reagents) - for(var/rid in initial_reagents) - var/amount = initial_reagents[rid] - if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) - owner.reagents.add_reagent(rid, amount, tastes.Copy()) - else - owner.reagents.add_reagent(rid, amount) - -/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - - if(!(food_flags & FOOD_IN_CONTAINER)) - switch (bitecount) - if (0) - return - if(1) - examine_list += "[parent] was bitten by someone!" - if(2,3) - examine_list += "[parent] was bitten [bitecount] times!" - else - examine_list += "[parent] was bitten multiple times!" - -/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) - SIGNAL_HANDLER - - return TryToEat(M, user) - -/datum/component/edible/proc/TryToEatTurf(datum/source, mob/user) - SIGNAL_HANDLER - - return TryToEat(user, user) - -///All the checks for the act of eating itself and -/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder) - - set waitfor = FALSE - - var/atom/owner = parent - - if(feeder.a_intent == INTENT_HARM) - return - if(!owner.reagents.total_volume)//Shouldn't be needed but it checks to see if it has anything left in it. - to_chat(feeder, "None of [owner] left, oh no!") - if(isturf(parent)) - var/turf/T = parent - T.ScrapeAway(1, CHANGETURF_INHERIT_AIR) - else - qdel(parent) - return - if(!CanConsume(eater, feeder)) - return - var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this - for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting - fullness += C.nutriment_factor * C.volume / C.metabolization_rate - - . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose - - if(eater == feeder)//If you're eating it yourself. - if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time - return - var/eatverb = pick(eatverbs) - if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS)) - to_chat(eater, "You don't feel like eating any more junk food at the moment!") - return - else if(fullness <= 50) - eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!") - else if(fullness > 50 && fullness < 150) - eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].") - else if(fullness > 150 && fullness < 500) - eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].") - else if(fullness > 500 && fullness < 600) - eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].") - else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat - eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!") - return - else //If you're feeding it to someone else. - if(isbrain(eater)) - to_chat(feeder, "[eater] doesn't seem to have a mouth!") - return - if(fullness <= (600 * (1 + eater.overeatduration / 1000))) - eater.visible_message("[feeder] attempts to feed [eater] [parent].", \ - "[feeder] attempts to feed you [parent].") - else - eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \ - "[feeder] cannot force any more of [parent] down your throat!") - return - if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed - return - - log_combat(feeder, eater, "fed", owner.reagents.log_list()) - eater.visible_message("[feeder] forces [eater] to eat [parent]!", \ - "[feeder] forces you to eat [parent]!") - - TakeBite(eater, feeder) - -///This function lets the eater take a bite and transfers the reagents to the eater. -/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder) - - var/atom/owner = parent - - if(!owner?.reagents) - return FALSE - if(eater.satiety > -200) - eater.satiety -= junkiness - playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) - if(owner.reagents.total_volume) - SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder) - var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) - owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST) - bitecount++ - On_Consume(eater) - checkLiked(fraction, eater) - - //Invoke our after eat callback if it is valid - if(after_eat) - after_eat.Invoke(eater, feeder) - - return TRUE - -///Checks whether or not the eater can actually consume the food -/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder) - if(!iscarbon(eater)) - return FALSE - var/mob/living/carbon/C = eater - var/covered = "" - if(C.is_mouth_covered(head_only = 1)) - covered = "headgear" - else if(C.is_mouth_covered(mask_only = 1)) - covered = "mask" - if(covered) - var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]" - to_chat(feeder, "You have to remove [who] [covered] first!") - return FALSE - return TRUE - -///Check foodtypes to see if we should send a moodlet -/datum/component/edible/proc/checkLiked(fraction, mob/M) - if(last_check_time + 50 > world.time) - return FALSE - if(!ishuman(M)) - return FALSE - var/mob/living/carbon/human/H = M - if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food) - to_chat(H, "You don't feel so good...") - H.adjust_disgust(25 + 30 * fraction) - else - if(foodtypes & H.dna.species.toxic_food) - to_chat(H,"What the hell was that thing?!") - H.adjust_disgust(25 + 30 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) - else if(foodtypes & H.dna.species.disliked_food) - to_chat(H,"That didn't taste very good...") - H.adjust_disgust(11 + 15 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) - else if(foodtypes & H.dna.species.liked_food) - to_chat(H,"I love this taste!") - H.adjust_disgust(-5 + -2.5 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) - if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) - last_check_time = world.time - -///Delete the item when it is fully eaten -/datum/component/edible/proc/On_Consume(mob/living/eater) - - var/atom/owner = parent - - if(!eater) - return - if(!owner.reagents.total_volume) - if(isturf(parent)) - var/turf/T = parent - T.ScrapeAway(1, CHANGETURF_INHERIT_AIR) - else - qdel(parent) - -///Ability to feed food to puppers -/datum/component/edible/proc/UseByAnimal(datum/source, mob/user) - - SIGNAL_HANDLER - - - var/atom/owner = parent - - if(!isdog(user)) - return - var/mob/living/L = user - if(bitecount == 0 || prob(50)) - L.manual_emote("nibbles away at \the [parent]") - bitecount++ - . = COMPONENT_ITEM_NO_ATTACK - L.taste(owner.reagents) // why should carbons get all the fun? - if(bitecount >= 5) - var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was") - if(sattisfaction_text) - L.manual_emote(sattisfaction_text) - qdel(parent) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm new file mode 100644 index 000000000000..89d8a52d67d9 --- /dev/null +++ b/code/datums/components/food/edible.dm @@ -0,0 +1,452 @@ +/*! + +This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items). +These items take a specific time to eat, and can do most of the things our original food items could. + +Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else: + Components: + Drying component (jerky etc) + Customizable component (custom pizzas etc) + Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.) + Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents) + + Misc: + Something for cakes (You can store things inside) + +*/ +/datum/component/edible + ///Amount of reagents taken per bite + var/bite_consumption = 2 + ///Amount of bites taken so far + var/bitecount = 0 + ///Flags for food + var/food_flags = NONE + ///Bitfield of the types of this food + var/foodtypes = NONE + ///Amount of seconds it takes to eat this food + var/eat_time = 30 + ///Defines how much it lowers someones satiety (Need to eat, essentialy) + var/junkiness = 0 + ///Message to send when eating + var/list/eatverbs + ///Callback to be ran for when you take a bite of something + var/datum/callback/after_eat + ///Callback to be ran for when you finish eating something + var/datum/callback/on_consume + ///Last time we checked for food likes + var/last_check_time + ///The initial reagents of this food when it is made + var/list/initial_reagents + ///The initial volume of the foods reagents + var/volume + ///The flavortext for taste + var/list/tastes + ///The type of atom this creates when the object is microwaved. + var/microwaved_type + +/datum/component/edible/Initialize(list/initial_reagents, + food_flags = NONE, + foodtypes = NONE, + volume = 50, + eat_time = 10, + list/tastes, + list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), + bite_consumption = 2, + microwaved_type, + junkiness, + datum/callback/pre_eat, + datum/callback/on_compost, + datum/callback/after_eat, + datum/callback/on_consume +) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, PROC_REF(UseByAnimal)) + RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, PROC_REF(on_craft)) + RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, PROC_REF(on_processed)) + RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_COOKED, PROC_REF(on_microwave_cooked)) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(use_from_hand)) + RegisterSignal(parent, COMSIG_ITEM_FRIED, PROC_REF(on_fried)) + RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_ACT, PROC_REF(on_microwaved)) + + var/obj/item/item = parent + if (!item.grind_results) + item.grind_results = list() //If this doesn't already exist, add it as an empty list. This is needed for the grinder to accept it. + + src.bite_consumption = bite_consumption + src.food_flags = food_flags + src.foodtypes = foodtypes + src.eat_time = eat_time + src.eatverbs = string_list(eatverbs) + src.junkiness = junkiness + src.after_eat = after_eat + src.on_consume = on_consume + src.initial_reagents = string_assoc_list(initial_reagents) + src.tastes = string_assoc_list(tastes) + src.microwaved_type = microwaved_type + + var/atom/owner = parent + + owner.create_reagents(volume, INJECTABLE) + + if(initial_reagents) + for(var/rid in initial_reagents) + var/amount = initial_reagents[rid] + if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) + owner.reagents.add_reagent(rid, amount, tastes.Copy()) + else + owner.reagents.add_reagent(rid, amount) + +/datum/component/edible/InheritComponent(datum/component/C, + i_am_original, + list/initial_reagents, + food_flags = NONE, + foodtypes = NONE, + volume = 50, + eat_time = 30, + list/tastes, + list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), + bite_consumption = 2, + datum/callback/pre_eat, + datum/callback/on_compost, + datum/callback/after_eat, + datum/callback/on_consume + ) + + . = ..() + src.bite_consumption = bite_consumption + src.food_flags = food_flags + src.foodtypes = foodtypes + src.eat_time = eat_time + src.eatverbs = eatverbs + src.junkiness = junkiness + src.pre_eat = pre_eat + src.on_compost = on_compost + src.after_eat = after_eat + src.on_consume = on_consume + +/datum/component/edible/Destroy(force, silent) + QDEL_NULL(pre_eat) + QDEL_NULL(on_compost) + QDEL_NULL(after_eat) + QDEL_NULL(on_consume) + return ..() + +/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!(food_flags & FOOD_IN_CONTAINER)) + switch (bitecount) + if (0) + return + if(1) + examine_list += "[parent] was bitten by someone!" + if(2,3) + examine_list += "[parent] was bitten [bitecount] times!" + else + examine_list += "[parent] was bitten multiple times!" + +/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) + SIGNAL_HANDLER + + return TryToEat(M, user) + +/datum/component/edible/proc/on_fried(fry_object) + SIGNAL_HANDLER + var/atom/our_atom = parent + our_atom.reagents.trans_to(fry_object, our_atom.reagents.total_volume) + qdel(our_atom) + return COMSIG_FRYING_HANDLED + +///Called when food is created through processing (Usually this means it was sliced). We use this to pass the OG items reagents. +/datum/component/edible/proc/on_processed(datum/source, atom/original_atom, list/chosen_processing_option) + SIGNAL_HANDLER + + if(!original_atom.reagents) + return + + var/atom/this_food = parent + var/reagents_for_slice = chosen_processing_option[TOOL_PROCESSING_AMOUNT] + + this_food.create_reagents(volume) //Make sure we have a reagent container + + original_atom.reagents.trans_to(this_food, reagents_for_slice) + + if(original_atom.name != initial(original_atom.name)) + this_food.name = "slice of [original_atom.name]" + if(original_atom.desc != initial(original_atom.desc)) + this_food.desc = "[original_atom.desc]" + +///Called when food is crafted through a crafting recipe datum. +/datum/component/edible/proc/on_craft(datum/source, list/parts_list, datum/crafting_recipe/food/recipe) + SIGNAL_HANDLER + + var/atom/this_food = parent + + this_food.reagents.clear_reagents() + + for(var/obj/item/crafted_part in this_food.contents) + crafted_part.reagents?.trans_to(this_food.reagents, crafted_part.reagents.maximum_volume, CRAFTED_FOOD_INGREDIENT_REAGENT_MODIFIER) + + var/list/objects_to_delete = list() + + // Remove all non recipe objects from the contents + for(var/content_object in this_food.contents) + for(var/recipe_object in recipe.real_parts) + if(istype(content_object, recipe_object)) + continue + objects_to_delete += content_object + + QDEL_LIST(objects_to_delete) + + for(var/r_id in initial_reagents) + var/amount = initial_reagents[r_id] * CRAFTED_FOOD_BASE_REAGENT_MODIFIER + if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin) + this_food.reagents.add_reagent(r_id, amount, tastes) + else + this_food.reagents.add_reagent(r_id, amount) + + SSblackbox.record_feedback("tally", "food_made", 1, type) + +/datum/component/edible/proc/on_microwaved(datum/source, obj/machinery/microwave/used_microwave) + SIGNAL_HANDLER + + var/turf/parent_turf = get_turf(parent) + + if(!microwaved_type) + new /obj/item/reagent_containers/food/snacks/badrecipe(parent_turf) + qdel(src) + return + + + var/obj/item/result + + result = new microwaved_type(parent_turf) + + var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1 + + SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, parent, efficiency) + + SSblackbox.record_feedback("tally", "food_made", 1, result.type) + +///Corrects the reagents on the newly cooked food +/datum/component/edible/proc/on_microwave_cooked(datum/source, obj/item/source_item, cooking_efficiency = 1) + SIGNAL_HANDLER + + var/atom/this_food = parent + + this_food.reagents.clear_reagents() + + source_item.reagents?.trans_to(this_food, source_item.reagents.total_volume) + + for(var/r_id in initial_reagents) + var/amount = initial_reagents[r_id] * cooking_efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER + if(r_id == /datum/reagent/consumable/nutriment || r_id == /datum/reagent/consumable/nutriment/vitamin) + this_food.reagents.add_reagent(r_id, amount, tastes) + else + this_food.reagents.add_reagent(r_id, amount) + +///Makes sure the thing hasn't been destroyed or fully eaten to prevent eating phantom edibles +/datum/component/edible/proc/IsFoodGone(atom/owner, mob/living/feeder) + if(QDELETED(owner)|| !(IS_EDIBLE(owner))) + return TRUE + if(owner.reagents.total_volume) + return FALSE + return TRUE + +/// Normal time to forcefeed someone something +#define EAT_TIME_FORCE_FEED (3 SECONDS) + +///All the checks for the act of eating itself and +/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder) + + set waitfor = FALSE // We might end up sleeping here, so we don't want to hold up anything + + var/atom/owner = parent + + if(feeder.a_intent == INTENT_HARM) + return + + . = COMPONENT_CANCEL_ATTACK_CHAIN //Point of no return I suppose + + if(IsFoodGone(owner, feeder)) + return + + if(!CanConsume(eater, feeder)) + return + var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this + for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting + fullness += C.nutriment_factor * C.volume / C.metabolization_rate + + var/time_to_eat = (eater = feeder) ? eat_time : EAT_TIME_FORCE_FEED + + if(eater == feeder)//If you're eating it yourself. + if(eat_time && !do_after(feeder, time_to_eat, eater, timed_action_flags = food_flags & FOOD_FINGER_FOOD ? IGNORE_USER_LOC_CHANGE | IGNORE_TARGET_LOC_CHANGE : NONE)) //Gotta pass the minimal eat time + return + if(IsFoodGone(owner, feeder)) + return + var/eatverb = pick(eatverbs) + + if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS)) + to_chat(eater, "You don't feel like eating any more junk food at the moment!") + return + else if(fullness <= 50) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!") + else if(fullness > 50 && fullness < 150) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].") + else if(fullness > 150 && fullness < 500) + eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].") + else if(fullness > 500 && fullness < 600) + eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].") + else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat + eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!") + return + + + + + + else //If you're feeding it to someone else. + if(isbrain(eater)) + to_chat(feeder, "[eater] doesn't seem to have a mouth!") + return + if(fullness <= (600 * (1 + eater.overeatduration / 1000))) + eater.visible_message( + "[feeder] attempts to feed [eater] [parent].", \ + "[feeder] attempts to feed you [parent]." + ) + if(eater.is_blind()) + to_chat(eater, "You feel someone trying to feed you something!") + else + eater.visible_message( + "[feeder] cannot force any more of [parent] down [eater]'s throat!", \ + "[feeder] cannot force any more of [parent] down your throat!" + ) + if(eater.is_blind()) + to_chat(eater, "You're too full to eat what's being fed to you!") + return + if(!do_after(feeder, delay = time_to_eat, target = eater)) //Wait 3 seconds before you can feed + return + if(IsFoodGone(owner, feeder)) + return + log_combat(feeder, eater, "fed", owner.reagents.log_list()) + eater.visible_message( + "[feeder] forces [eater] to eat [parent]!", \ + "[feeder] forces you to eat [parent]!" + ) + if(eater.is_blind()) + to_chat(eater, "You're forced to eat something!") + + TakeBite(eater, feeder) + + //If we're not force-feeding, try take another bite + if(eater == feeder && eat_time) + INVOKE_ASYNC(src, PROC_REF(TryToEat), eater, feeder) + +#undef EAT_TIME_FORCE_FEED + +///This function lets the eater take a bite and transfers the reagents to the eater. +/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder) + + var/atom/owner = parent + + if(!owner?.reagents) + return FALSE + if(eater.satiety > -200) + eater.satiety -= junkiness + playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) + if(!owner.reagents.total_volume) + return + SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder, bitecount, bite_consumption) + var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) + owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST) + bitecount++ + check_liked(fraction, eater) + if(!owner.reagents.total_volume) + on_consume(eater, feeder) + + //Invoke our after eat callback if it is valid + if(after_eat) + after_eat.Invoke(eater, feeder, bitecount) + + return TRUE + +///Checks whether or not the eater can actually consume the food +/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder) + if(!iscarbon(eater)) + return FALSE + var/mob/living/carbon/C = eater + var/covered = "" + if(C.is_mouth_covered(head_only = 1)) + covered = "headgear" + else if(C.is_mouth_covered(mask_only = 1)) + covered = "mask" + if(covered) + var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]" + to_chat(feeder, "You have to remove [who] [covered] first!") + return FALSE + return TRUE + +///Check foodtypes to see if we should send a moodlet +/datum/component/edible/proc/checkLiked(fraction, mob/M) + if(last_check_time + 50 > world.time) + return FALSE + if(!ishuman(M)) + return FALSE + var/mob/living/carbon/human/H = M + if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food) + to_chat(H, "You don't feel so good...") + H.adjust_disgust(25 + 30 * fraction) + else + if(foodtypes & H.dna.species.toxic_food) + to_chat(H,"What the hell was that thing?!") + H.adjust_disgust(25 + 30 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) + else if(foodtypes & H.dna.species.disliked_food) + to_chat(H,"That didn't taste very good...") + H.adjust_disgust(11 + 15 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) + else if(foodtypes & H.dna.species.liked_food) + to_chat(H,"I love this taste!") + H.adjust_disgust(-5 + -2.5 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) + if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) + last_check_time = world.time + +///Delete the item when it is fully eaten +/datum/component/edible/proc/on_consume(mob/living/eater, mob/living/feeder) + SEND_SIGNAL(parent, COMSIG_FOOD_CONSUMED, eater, feeder) + + on_consume?.Invoke(eater, feeder) + + if(isturf(parent)) + var/turf/T = parent + T.ScrapeAway(1, CHANGETURF_INHERIT_AIR) + else + qdel(parent) + +///Ability to feed food to puppers +/datum/component/edible/proc/UseByAnimal(datum/source, mob/user) + + SIGNAL_HANDLER + + + var/atom/owner = parent + + if(!isdog(user)) + return + var/mob/living/L = user + if(bitecount == 0 || prob(50)) + L.manual_emote("nibbles away at \the [parent]") + bitecount++ + . = COMPONENT_ITEM_NO_ATTACK + L.taste(owner.reagents) // why should carbons get all the fun? + if(bitecount >= 5) + var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was") + if(sattisfaction_text) + L.manual_emote(sattisfaction_text) + qdel(parent) diff --git a/code/datums/components/food/food_storage.dm b/code/datums/components/food/food_storage.dm new file mode 100644 index 000000000000..6e1226b2dc69 --- /dev/null +++ b/code/datums/components/food/food_storage.dm @@ -0,0 +1,204 @@ +/// --Food storage component-- +/// This component lets you slide one item into large foods, such as bread, cheese wheels, or cakes. +/// Consuming food storages with an item inside can cause unique interactions, such as eating glass shards. + +/datum/component/food_storage + /// Reference to what we have in our food. + var/obj/item/stored_item + /// The amount of volume the food has on creation - Used for probabilities + var/initial_volume = 10 + /// Minimum size items that can be inserted + var/minimum_weight_class = WEIGHT_CLASS_SMALL + /// What are the odds we bite into the stored item? + var/bad_chance_of_discovery = 0 + /// What are the odds we see the stored item before we bite it? + var/good_chance_of_discovery = 100 + /// The stored item was found out somehow. + var/discovered = FALSE + +/datum/component/food_storage/Initialize(_minimum_weight_class = WEIGHT_CLASS_SMALL, _bad_chance = 0, _good_chance = 100) + + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(try_inserting_item)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(try_removing_item)) + RegisterSignal(parent, COMSIG_FOOD_EATEN, PROC_REF(consume_food_storage)) + + var/atom/food = parent + initial_volume = food.reagents.total_volume + + minimum_weight_class = _minimum_weight_class + bad_chance_of_discovery = _bad_chance + good_chance_of_discovery = _good_chance + +/datum/component/food_storage/Destroy(force, silent) + if(stored_item) + stored_item.forceMove(stored_item.drop_location()) + stored_item.dropped() + stored_item = null + . = ..() + +/** Begins the process of inserted an item. + * + * Clicking on the food storage with an item on disarm intent will begin a do_after, which if successful inserts the item. + * + * Arguments + * inserted_item - the item being placed into the food + * user - the person inserting the item + */ +/datum/component/food_storage/proc/try_inserting_item(datum/source, obj/item/inserted_item, mob/user, params) + SIGNAL_HANDLER + + // No matryoshka-ing food storage + if(istype(inserted_item, /obj/item/storage) || IS_EDIBLE(inserted_item)) + return + + //Harm intent will bypass inserting for injecting food with syringes and such + if(user.a_intent == INTENT_HARM) + return + + if(inserted_item.w_class > minimum_weight_class) + to_chat(user, "\The [inserted_item.name] won't fit in \the [parent].") + return + + if(!QDELETED(stored_item)) + to_chat(user, "There's something in \the [parent].") + return + + if(HAS_TRAIT(inserted_item, TRAIT_NODROP)) + to_chat(user, "\the [inserted_item] is stuck to your hand, you can't put into \the [parent]!") + return + + user.visible_message("[user.name] begins inserting [inserted_item.name] into \the [parent].", \ + "You start to insert the [inserted_item.name] into \the [parent].") + + INVOKE_ASYNC(src, PROC_REF(insert_item), inserted_item, user) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/** Begins the process of attempting to remove the stored item. + * + * Clicking on food storage on grab intent will begin a do_after, which if successful removes the stored_item. + * + * Arguments + * user - the person removing the item. + */ +/datum/component/food_storage/proc/try_removing_item(datum/source, mob/user) + SIGNAL_HANDLER + + var/atom/food = parent + + if(user.a_intent != INTENT_GRAB) + return + + if(QDELETED(stored_item)) + return + + if(!food.can_interact(user)) + return + + user.visible_message("[user.name] begins tearing at \the [parent].", \ + "You start to rip into \the [parent].") + + INVOKE_ASYNC(src, PROC_REF(begin_remove_item), user) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/** Inserts the item into the food, after a do_after. + * + * Arguments + * inserted_item - The item being inserted. + * user - the person inserting the item. + */ +/datum/component/food_storage/proc/insert_item(obj/item/inserted_item, mob/user) + if(do_after(user, 1.5 SECONDS, target = parent)) + var/atom/food = parent + to_chat(user, "You slip [inserted_item.name] inside \the [parent].") + inserted_item.forceMove(food) + user.log_message("[key_name(user)] inserted [inserted_item] into [parent] at [AREACOORD(user)]", LOG_ATTACK) + food.add_fingerprint(user) + inserted_item.add_fingerprint(user) + + stored_item = inserted_item + +/** Removes the item from the food, after a do_after. + * + * Arguments + * user - person removing the item. + */ +/datum/component/food_storage/proc/begin_remove_item(mob/user) + if(do_after(user, 10 SECONDS, target = parent)) + remove_item(user) + +/** + * Removes the stored item, putting it in user's hands or on the ground, then updates the reference. + */ +/datum/component/food_storage/proc/remove_item(mob/user) + if(user.put_in_hands(stored_item)) + user.visible_message("[user.name] slowly pulls [stored_item.name] out of \the [parent].", \ + "You slowly pull [stored_item.name] out of \the [parent].") + else + stored_item.dropped() + stored_item.visible_message("[stored_item.name] falls out of \the [parent].") + + update_stored_item() + +/** Checks for stored items when the food is eaten. + * + * If the food is eaten while an item is stored in it, calculates the odds that the item will be found. + * Then, if the item is found before being bitten, the item is removed. + * If the item is found by biting into it, calls on_accidental_consumption on the stored item. + * Afterwards, removes the item from the food if it was discovered. + * + * Arguments + * target - person doing the eating (can be the same as user) + * user - person causing the eating to happen + * bitecount - how many times the current food has been bitten + * bitesize - how large bties are for this food + */ +/datum/component/food_storage/proc/consume_food_storage(datum/source, mob/living/target, mob/living/user, bitecount, bitesize) + SIGNAL_HANDLER + + if(QDELETED(stored_item)) //if the stored item was deleted/null... + if(!update_stored_item()) //check if there's a replacement item + return + + /// Chance of biting the held item = amount of bites / (intitial reagents / reagents per bite) * 100 + bad_chance_of_discovery = (bitecount / (initial_volume / bitesize))*100 + /// Chance of finding the held item = bad chance - 50 + good_chance_of_discovery = bad_chance_of_discovery - 50 + + if(prob(good_chance_of_discovery)) //finding the item, without biting it + discovered = TRUE + to_chat(target, "It feels like there's something in \the [parent]...!") + + else if(prob(bad_chance_of_discovery)) //finding the item, BY biting it + user.log_message("[key_name(user)] just fed [key_name(target)] a/an [stored_item] which was hidden in [parent] at [AREACOORD(target)]", LOG_ATTACK) + discovered = stored_item.on_accidental_consumption(target, user, parent) + update_stored_item() //make sure if the item was changed, the reference changes as well + + if(!QDELETED(stored_item) && discovered) + INVOKE_ASYNC(src, PROC_REF(remove_item), user) + +/** Updates the reference of the stored item. + * + * Checks the food's contents for if an alternate item was placed into the food. + * If there is an alternate item, updates the reference to the new item. + * If there isn't, updates the reference to null. + * + * Returns FALSE if the ref is nulled, or TRUE is another item replaced it. + */ +/datum/component/food_storage/proc/update_stored_item() + var/atom/food = parent + if(!food?.contents.len) //if there's no items in the food or food is deleted somehow + stored_item = null + return FALSE + + for(var/obj/item/i in food.contents) //search the food's contents for a replacement item + if(IS_EDIBLE(i)) + continue + if(QDELETED(i)) + continue + + stored_item = i //we found something to replace it + return TRUE + + //if there's nothing else in the food, or we found nothing valid + stored_item = null + return FALSE diff --git a/code/datums/elements/food/dunkable.dm b/code/datums/elements/food/dunkable.dm new file mode 100644 index 000000000000..80661d5c4ac0 --- /dev/null +++ b/code/datums/elements/food/dunkable.dm @@ -0,0 +1,34 @@ +// If an item has the dunkable element, it's able to be dunked into reagent containers like beakers and glasses. +// Dunking the item into a container will transfer reagents from the container to the item. +/datum/element/dunkable + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/dunk_amount // the amount of reagents that will be transfered from the container to the item on each click + +/datum/element/dunkable/Attach(datum/target, amount_per_dunk) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + dunk_amount = amount_per_dunk + RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(get_dunked)) + +/datum/element/dunkable/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_ITEM_AFTERATTACK) + +/datum/element/dunkable/proc/get_dunked(datum/source, atom/target, mob/user, proximity_flag) + if(!proximity_flag) // if the user is not adjacent to the container + return + var/obj/item/reagent_containers/container = target // the container we're trying to dunk into + if(istype(container) && container.reagent_flags & DUNKABLE) // container should be a valid target for dunking + if(!container.is_drainable()) + to_chat(user, "[container] is unable to be dunked in!") + return + var/obj/item/I = source // the item that has the dunkable element + if(container.reagents.trans_to(I, dunk_amount, transfered_by = user)) //if reagents were transfered, show the message + to_chat(user, "You dunk \the [I] into \the [container].") + return + if(!container.reagents.total_volume) + to_chat(user, "[container] is empty!") + else + to_chat(user, "[I] is full!") diff --git a/code/datums/elements/food/food_trash.dm b/code/datums/elements/food/food_trash.dm new file mode 100644 index 000000000000..6c484c414a07 --- /dev/null +++ b/code/datums/elements/food/food_trash.dm @@ -0,0 +1,40 @@ +// If an item has the food_trash element it will drop an item when it is consumed. +/datum/element/food_trash + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + /// The type of trash that is spawned by this element + var/trash + ///Flags of the trash element that change its behavior UNUSED UNTIL PART 2 + //var/flags + ///Generate trash proc path + var/generate_trash_procpath + +/datum/element/food_trash/Attach(datum/target, atom/trash, flags, generate_trash_proc) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + src.trash = trash + //src.flags = flags + RegisterSignal(target, COMSIG_FOOD_CONSUMED, PROC_REF(generate_trash)) + if(!generate_trash_procpath && generate_trash_proc) + generate_trash_procpath = generate_trash_proc + +/datum/element/food_trash/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_FOOD_CONSUMED) + +/datum/element/food_trash/proc/generate_trash(datum/source, mob/living/eater, mob/living/feeder) + SIGNAL_HANDLER + + ///cringy signal_handler shouldnt be needed if you dont want to return but oh well + INVOKE_ASYNC(src, PROC_REF(async_generate_trash), source) + +/datum/element/food_trash/proc/async_generate_trash(datum/source) + var/atom/edible_object = source + + var/obj/item/trash_item = generate_trash_procpath ? call(source, generate_trash_procpath)() : new trash(edible_object.drop_location()) + + if(isliving(edible_object.loc)) + var/mob/living/food_holding_mob = edible_object.loc + food_holding_mob.dropItemToGround(edible_object) + food_holding_mob.put_in_hands(trash_item) diff --git a/code/datums/elements/food/processable.dm b/code/datums/elements/food/processable.dm new file mode 100644 index 000000000000..503e5169c877 --- /dev/null +++ b/code/datums/elements/food/processable.dm @@ -0,0 +1,47 @@ +// If an item has the processable item, it can be processed into another item with a specific tool. This adds generic behavior for those actions to make it easier to set-up generically. +/datum/element/processable + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + ///The type of atom this creates when the processing recipe is used. + var/result_atom_type + ///The tool behaviour for this processing recipe + var/tool_behaviour + ///Time to process the atom + var/time_to_process + ///Amount of the resulting actor this will create + var/amount_created + ///Whether or not the atom being processed has to be on a table or tray to process it + var/table_required + +/datum/element/processable/Attach(datum/target, tool_behaviour, result_atom_type, amount_created = 3, time_to_process = 20, table_required = FALSE) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + + src.tool_behaviour = tool_behaviour + src.amount_created = amount_created + src.time_to_process = time_to_process + src.result_atom_type = result_atom_type + src.table_required = table_required + + RegisterSignal(target, COMSIG_ATOM_TOOL_ACT(tool_behaviour), PROC_REF(try_process)) + +/datum/element/processable/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_ATOM_TOOL_ACT(tool_behaviour)) + +/datum/element/processable/proc/try_process(datum/source, mob/living/user, obj/item/I, list/mutable_recipes) + SIGNAL_HANDLER + + if(table_required) + var/obj/item/found_item = source + var/found_location = found_item.loc + var/found_turf = isturf(found_location) + var/found_table = locate(/obj/structure/table) in found_location + var/found_tray = locate(/obj/item/storage/bag/tray) in found_location + if(!found_turf && !istype(found_location, /obj/item/storage/bag/tray) || found_turf && !(found_table || found_tray)) + to_chat(user, "You cannot make that here! You need a table or at least a tray.") + return + + mutable_recipes += list(list(TOOL_PROCESSING_RESULT = result_atom_type, TOOL_PROCESSING_AMOUNT = amount_created, TOOL_PROCESSING_TIME = time_to_process)) + return COMPONENT_NO_AFTERATTACK diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 4f505cb2a3e7..28ae234cf702 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -162,5 +162,14 @@ Simple datum which is instanced once per type and is used for every object of sa * - amount: The amount of the material to break down. * - breakdown_flags: Some flags dictating how exactly this material is being broken down. */ +/** + * This proc is called when the mat is found in an item that's consumed by accident. see /obj/item/proc/on_accidental_consumption. + * Arguments + * * M - person consuming the mat + * * S - (optional) item the mat is contained in (NOT the item with the mat itself) + */ +/datum/material/proc/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S) + return FALSE + /datum/material/proc/return_composition(amount=1, breakdown_flags=NONE) return list((src) = amount) // Yes we need the parenthesis, without them BYOND stringifies src into "src" and things break. diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 8cb9f50008f4..2f96084223e9 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -469,7 +469,7 @@ to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.") dumb_thing = FALSE //only once per life if(prob(1)) - new/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code + new/obj/item/food/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code // small chance to make eye contact with inanimate objects/mindless mobs because of nerves /datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6c6849724bde..77f211c97148 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -453,22 +453,24 @@ * Otherwise it simply forceMoves the atom into this atom */ /atom/proc/CheckParts(list/parts_list, datum/crafting_recipe/R) + SEND_SIGNAL(src, COMSIG_ATOM_CHECKPARTS, parts_list, R) + if(parts_list, datum/crafting_recipe/R) SEND_SIGNAL(src, COMSIG_ATOM_CHECKPARTS, parts_list, R) if(parts_list) - for(var/A in parts_list) - if(istype(A, /datum/reagent)) - if(!reagents) - reagents = new() - reagents.reagent_list.Add(A) - reagents.conditional_update() - else if(ismovable(A)) - var/atom/movable/M = A - if(isliving(M.loc)) - var/mob/living/L = M.loc - L.transferItemToLoc(M, src) - else - M.forceMove(src) - SEND_SIGNAL(M, COMSIG_ATOM_USED_IN_CRAFT, src) + for(var/A in parts_list) + if(istype(A, /datum/reagent)) + if(!reagents) + reagents = new() + reagents.reagent_list.Add(A) + reagents.conditional_update() + else if(ismovable(A)) + var/atom/movable/M = A + if(isliving(M.loc)) + var/mob/living/L = M.loc + L.transferItemToLoc(M, src) + else + M.forceMove(src) + SEND_SIGNAL(M, COMSIG_ATOM_USED_IN_CRAFT, src) parts_list.Cut() ///Take air from the passed in gas mixture datum @@ -1275,25 +1277,71 @@ * Must return parent proc ..() in the end if overridden */ /atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) + var/signal_result + + var/list/processing_recipes = list() //List of recipes that can be mutated by sending the signal + signal_result = SEND_SIGNAL(src, COMSIG_ATOM_TOOL_ACT(tool_type), user, I, processing_recipes) + if(processing_recipes.len) + process_recipes(user, I, processing_recipes) + if(QDELETED(I)) + return TRUE switch(tool_type) if(TOOL_CROWBAR) - . |= crowbar_act(user, I) + . = crowbar_act(user, I) if(TOOL_MULTITOOL) - . |= multitool_act(user, I) + . = multitool_act(user, I) if(TOOL_SCREWDRIVER) - . |= screwdriver_act(user, I) + . = screwdriver_act(user, I) if(TOOL_WRENCH) - . |= wrench_act(user, I) + . = wrench_act(user, I) if(TOOL_WIRECUTTER) - . |= wirecutter_act(user, I) + . = wirecutter_act(user, I) if(TOOL_WELDER) - . |= welder_act(user, I) + . = welder_act(user, I) if(TOOL_ANALYZER) - . |= analyzer_act(user, I) - if(. & COMPONENT_BLOCK_TOOL_ATTACK) + . = analyzer_act(user, I) + if(. || signal_result & COMPONENT_BLOCK_TOOL_ATTACK) //Either the proc or the signal handled the tool's events in some way. return TRUE -//! Tool-specific behavior procs. They send signals, so try to call ..() +/atom/proc/process_recipes(mob/living/user, obj/item/I, list/processing_recipes) + //Only one recipe? use the first + if(processing_recipes.len == 1) + StartProcessingAtom(user, I, processing_recipes[1]) + return + //Otherwise, select one with a radial + ShowProcessingGui(user, I, processing_recipes) + +///Creates the radial and processes the selected option +/atom/proc/ShowProcessingGui(mob/living/user, obj/item/I, list/possible_options) + var/list/choices_to_options = list() //Dict of object name | dict of object processing settings + var/list/choices = list() + + for(var/i in possible_options) + var/list/current_option = i + var/atom/current_option_type = current_option[TOOL_PROCESSING_RESULT] + choices_to_options[initial(current_option_type.name)] = current_option + var/image/option_image = image(icon = initial(current_option_type.icon), icon_state = initial(current_option_type.icon_state)) + choices += list("[initial(current_option_type.name)]" = option_image) + + var/pick = show_radial_menu(user, src, choices, radius = 36, require_near = TRUE) + + StartProcessingAtom(user, I, choices_to_options[pick]) + + +/atom/proc/StartProcessingAtom(mob/living/user, obj/item/I, list/chosen_option) + to_chat(user, "You start working on [src]") + if(I.use_tool(src, user, chosen_option[TOOL_PROCESSING_TIME], volume=50)) + var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT] + for(var/i = 1 to chosen_option[TOOL_PROCESSING_AMOUNT]) + new atom_to_create(loc) + to_chat(user, "You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.name)] from [src]") + qdel(src) + return + +/atom/proc/OnCreatedFromProcessing(mob/living/user, obj/item/I, list/chosen_option, atom/original_atom) + return + +//! Tool-specific behavior procs. /// ///Crowbar act diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index df7c5ae431c5..f380bc6bfa52 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1059,6 +1059,98 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb embed_chance_turf_mod = (!isnull(embedding["embed_chance_turf_mod"]) ? embedding["embed_chance_turf_mod"] : EMBED_CHANCE_TURF_MOD)) return TRUE +/// How many different types of mats will be counted in a bite? +#define MAX_MATS_PER_BITE 2 + +/* + * On accidental consumption: when you somehow end up eating an item accidentally (currently, this is used for when items are hidden in food like bread or cake) + * + * The base proc will check if the item is sharp and has a decent force. + * Then, it checks the item's mat datums for the effects it applies afterwards. + * Then, it checks tiny items. + * After all that, it returns TRUE if the item is set to be discovered. Otherwise, it returns FALSE. + * + * This works similarily to /suicide_act: if you want an item to have a unique interaction, go to that item + * and give it an /on_accidental_consumption proc override. For a simple example of this, check out the nuke disk. + * + * Arguments + * * M - the mob accidentally consuming the item + * * user - the mob feeding M the item - usually, it's the same as M + * * source_item - the item that held the item being consumed - bread, cake, etc + * * discover_after - if the item will be discovered after being chomped (FALSE will usually mean it was swallowed, TRUE will usually mean it was bitten into and discovered) + */ +/obj/item/proc/on_accidental_consumption(mob/living/carbon/victim, mob/living/carbon/user, obj/item/source_item, discover_after = TRUE) + if(is_sharp() && force >= 5) //if we've got something sharp with a decent force (ie, not plastic) + INVOKE_ASYNC(victim, TYPE_PROC_REF(/mob, emote), "scream") + victim.visible_message("[victim] looks like [victim.p_theyve()] just bit something they shouldn't have!", \ + "OH GOD! Was that a crunch? That didn't feel good at all!!") + + victim.apply_damage(max(15, force), BRUTE, BODY_ZONE_HEAD) + victim.losebreath += 2 + if(tryEmbed(victim.get_bodypart(BODY_ZONE_CHEST), forced = TRUE)) //and if it embeds successfully in their chest, cause a lot of pain + victim.apply_damage(max(25, force*1.5), BRUTE, BODY_ZONE_CHEST) + victim.losebreath += 6 + discover_after = FALSE + if(QDELETED(src)) // in case trying to embed it caused its deletion (say, if it's DROPDEL) + return + source_item?.reagents?.add_reagent(/datum/reagent/blood, 2) + + else if(custom_materials?.len) //if we've got materials, lets see whats in it + /// How many mats have we found? You can only be affected by two material datums by default + var/found_mats = 0 + /// How much of each material is in it? Used to determine if the glass should break + var/total_material_amount = 0 + + for(var/mats in custom_materials) + total_material_amount += custom_materials[mats] + if(found_mats >= MAX_MATS_PER_BITE) + continue //continue instead of break so we can finish adding up all the mats to the total + + var/datum/material/discovered_mat = mats + if(discovered_mat.on_accidental_mat_consumption(victim, source_item)) + found_mats++ + + //if there's glass in it and the glass is more than 60% of the item, then we can shatter it + if(custom_materials[getmaterialref(/datum/material/glass)] >= total_material_amount * 0.60) + if(prob(66)) //66% chance to break it + /// The glass shard that is spawned into the source item + var/obj/item/shard/broken_glass = new /obj/item/shard(loc) + broken_glass.name = "broken [name]" + broken_glass.desc = "This used to be \a [name], but it sure isn't anymore." + playsound(victim, "shatter", 25, TRUE) + qdel(src) + if(QDELETED(source_item)) + broken_glass.on_accidental_consumption(victim, user) + else //33% chance to just "crack" it (play a sound) and leave it in the bread + playsound(victim, "shatter", 15, TRUE) + discover_after = FALSE + + victim.adjust_disgust(33) + victim.visible_message( + "[victim] looks like [victim.p_theyve()] just bitten into something hard.", \ + "Eugh! Did I just bite into something?") + + else if(w_class == WEIGHT_CLASS_TINY) //small items like soap or toys that don't have mat datums + /// victim's chest (for cavity implanting the item) + var/obj/item/bodypart/chest/victim_cavity = victim.get_bodypart(BODY_ZONE_CHEST) + if(victim_cavity.cavity_item) + victim.vomit(5, FALSE, FALSE, distance = 0) + forceMove(drop_location()) + to_chat(victim, "You vomit up a [name]! [source_item? "Was that in \the [source_item]?" : ""]") + else + victim.transferItemToLoc(src, victim, TRUE) + victim.losebreath += 2 + victim_cavity.cavity_item = src + to_chat(victim, "You swallow hard. [source_item? "Something small was in \the [source_item]..." : ""]") + discover_after = FALSE + + else + to_chat(victim, "[source_item? "Something strange was in the \the [source_item]..." : "I just bit something strange..."] ") + + return discover_after + +#undef MAX_MATS_PER_BITE + // Update icons if this is being carried by a mob /obj/item/wash(clean_types) . = ..() diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm new file mode 100644 index 000000000000..b8233e0ecc76 --- /dev/null +++ b/code/game/objects/items/food/_food.dm @@ -0,0 +1,67 @@ +///Abstract class to allow us to easily create all the generic "normal" food without too much copy pasta of adding more components +/obj/item/food + name = "food" + desc = "you eat this" + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_SMALL + icon = 'icons/obj/food/food.dmi' + icon_state = null + lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' + ///List of reagents this food gets on creation + var/list/food_reagents + ///Extra flags for things such as if the food is in a container or not + var/food_flags + ///Bitflag of the types of food this food is + var/foodtypes + ///Amount of volume the food can contain + var/max_volume + ///How long it will take to eat this food without any other modifiers + var/eat_time + ///Tastes to describe this food + var/list/tastes + ///Verbs used when eating this food in the to_chat messages + var/list/eatverbs + ///How much reagents per bite + var/bite_consumption + ///What you get if you microwave the food, this should be replaced once I fully re-work cooking. + var/microwaved_type + ///Type of atom thats spawned after eating this item + var/trash_type + +/obj/item/food/Initialize() + . = ..() + if(food_reagents) + food_reagents = string_assoc_list(food_reagents) + if(tastes) + tastes = string_assoc_list(tastes) + if(eatverbs) + eatverbs = string_list(eatverbs) + make_edible() + make_processable() + make_leave_trash() + +///This proc adds the edible component, overwrite this if you for some reason want to change some specific args like callbacks. +/obj/item/food/proc/make_edible() + AddComponent(/datum/component/edible,\ + initial_reagents = food_reagents,\ + food_flags = food_flags,\ + foodtypes = foodtypes,\ + volume = max_volume,\ + eat_time = eat_time,\ + tastes = tastes,\ + eatverbs = eatverbs,\ + bite_consumption = bite_consumption,\ + microwaved_type = microwaved_type,\ + ) + + +///This proc handles processable elements, overwrite this if you want to add behavior such as slicing, forking, spooning, whatever, to turn the item into something else +/obj/item/food/proc/make_processable() + return + +///This proc handles trash components, overwrite this if you want the object to spawn trash +/obj/item/food/proc/make_leave_trash() + if(trash_type) + AddElement(/datum/element/food_trash, trash_type) + return diff --git a/code/game/objects/items/food/bread.dm b/code/game/objects/items/food/bread.dm new file mode 100644 index 000000000000..87cddc63be1a --- /dev/null +++ b/code/game/objects/items/food/bread.dm @@ -0,0 +1,412 @@ + +/obj/item/food/bread + name = "bread?" + desc = "This shouldn't exist, report to codermonkeys" + icon = 'icons/obj/food/burgerbread.dmi' + max_volume = 80 + tastes = list("bread" = 10) + foodtypes = GRAIN + eat_time = 3 SECONDS + /// type is spawned 5 at a time and replaces this bread loaf when processed by cutting tool + var/obj/item/food/breadslice/slice_type + /// so that the yield can change if it isnt 5 + var/yield = 5 + +/obj/item/food/bread/Initialize(mapload) + . = ..() + AddElement(/datum/element/dunkable, 10) + AddComponent(/datum/component/food_storage) + +/obj/item/food/bread/make_processable() + if (slice_type) + AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE) + AddElement(/datum/element/processable, TOOL_SAW, slice_type, yield, 4 SECONDS, table_required = TRUE) + +/obj/item/food/breadslice + name = "breadslice?" + desc = "This shouldn't exist, report to codermonkeys" + icon = 'icons/obj/food/burgerbread.dmi' + foodtypes = GRAIN + food_flags = FOOD_FINGER_FOOD + eat_time = 0.5 SECONDS + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/breadslice/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) + +/obj/item/food/bread/plain + name = "bread" + desc = "Some plain old earthen bread." + icon_state = "bread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10 + ) + tastes = list("bread" = 10) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_SMALL + slice_type = /obj/item/food/breadslice/plain + +/obj/item/food/breadslice/plain + name = "bread slice" + desc = "A slice of home." + icon_state = "breadslice" + foodtypes = GRAIN + food_reagents = list( + /datum/reagent/consumable/nutriment = 2 + ) + +/* + * REAL MOLDY FOOD. We just cant support it right now. Start porting after newfood is complete + * +/obj/item/food/breadslice/moldy + name = "moldy 'bread' slice" + desc = "Entire stations have been ripped apart arguing whether this is still good to eat." + icon_state = "moldybreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/mold = 10, + ) + tastes = list("decaying fungus" = 1) + foodtypes = GROSS + preserved_food = TRUE + +/obj/item/food/breadslice/moldy/bacteria + name = "bacteria-rich moldy 'bread' slice" + desc = "Something (possibly necroyeast) has caused this bread to rise in a macabre state of unlife. \ + It lurchs about when unattended. You might want to locate a priest if you see this. Or maybe a flamethrower." + +/obj/item/food/breadslice/moldy/bacteria/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOLD, CELL_VIRUS_TABLE_GENERIC, rand(2, 4), 25) +*/ + +/obj/item/food/breadslice/moldy + name = "moldy bread slice" + desc = "Entire stations have been ripped apart over arguing whether this is still good to eat." + icon_state = "moldybreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 2 + ) + tastes = list("decaying fungus" = 1) + foodtypes = GROSS + +/obj/item/food/bread/meat + name = "meatbread loaf" + desc = "The culinary base of every self-respecting eloquen/tg/entleman." + icon_state = "meatbread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("bread" = 10, "meat" = 10) + foodtypes = GRAIN | MEAT + slice_type = /obj/item/food/breadslice/meat + +/obj/item/food/breadslice/meat + name = "meatbread slice" + desc = "A slice of delicious meatbread." + icon_state = "meatbreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 2 + ) + tastes = list("bread" = 1, "meat" = 1) + foodtypes = GRAIN | MEAT + +/obj/item/food/bread/xenomeat + name = "xenomeatbread loaf" + desc = "Extra Heretical." + icon_state = "xenomeatbread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("bread" = 10, "acid" = 10) + foodtypes = GRAIN | MEAT + slice_type = /obj/item/food/breadslice/xenomeat + +/obj/item/food/breadslice/xenomeat + name = "xenomeatbread slice" + desc = "A slice of delicious meatbread. Extra Heretical." + icon_state = "xenobreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 2 + ) + tastes = list("bread" = 10, "acid" = 10) + foodtypes = GRAIN | MEAT + +/obj/item/food/bread/spidermeat + name = "spider meat loaf" + desc = "Reassuringly green meatloaf made from spider meat." + icon_state = "spidermeatbread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/toxin = 15, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("bread" = 10, "cobwebs" = 5) + foodtypes = GRAIN | MEAT | TOXIC + slice_type = /obj/item/food/breadslice/spidermeat + +/obj/item/food/breadslice/spidermeat + name = "spider meat bread slice" + desc = "A slice of meatloaf made from an animal that most likely still wants you dead." + icon_state = "xenobreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/toxin = 3, + /datum/reagent/consumable/nutriment/vitamin = 1 + ) + tastes = list("bread" = 10, "cobwebs" = 5) + foodtypes = GRAIN | MEAT | TOXIC + +/obj/item/food/bread/banana + name = "banana-nut bread" + desc = "A heavenly and filling treat." + icon_state = "bananabread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/banana = 20 + ) + tastes = list("bread" = 10) // bananjuice will also flavour + foodtypes = GRAIN | FRUIT + slice_type = /obj/item/food/breadslice/banana + +/obj/item/food/breadslice/banana + name = "banana-nut bread slice" + desc = "A slice of delicious banana bread." + icon_state = "bananabreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/banana = 4 + ) + tastes = list("bread" = 10) + foodtypes = GRAIN | FRUIT + +/obj/item/food/bread/tofu + name = "Tofubread" + desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." + icon_state = "tofubread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("bread" = 10, "tofu" = 10) + foodtypes = GRAIN | VEGETABLES + slice_type = /obj/item/food/breadslice/tofu + +/obj/item/food/breadslice/tofu + name = "tofubread slice" + desc = "A slice of delicious tofubread." + icon_state = "tofubreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 2 + ) + tastes = list("bread" = 10, "tofu" = 10) + foodtypes = GRAIN | VEGETABLES + +/obj/item/food/bread/creamcheese + name = "cream cheese bread" + desc = "Just a schmear." + icon_state = "creamcheesebread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("bread" = 10, "cheese" = 10) + foodtypes = GRAIN | DAIRY + slice_type = /obj/item/food/breadslice/creamcheese + +/obj/item/food/breadslice/creamcheese + name = "cream cheese bread slice" + desc = "A slice of Brotherly love!" + icon_state = "creamcheesebreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 2 + ) + tastes = list("bread" = 10, "cheese" = 10) + foodtypes = GRAIN | DAIRY + +/obj/item/food/bread/mimana + name = "mimana bread" + desc = "Best eaten in silence." + icon_state = "mimanabread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/toxin/mutetoxin = 10, + /datum/reagent/consumable/nothing = 10, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("bread" = 10, "silence" = 10) + foodtypes = GRAIN | FRUIT + slice_type = /obj/item/food/breadslice/mimana + +/obj/item/food/breadslice/mimana + name = "mimana bread slice" + desc = "A slice of silence!" + icon_state = "mimanabreadslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/toxin/mutetoxin = 2, + /datum/reagent/consumable/nothing = 2, + /datum/reagent/consumable/nutriment/vitamin = 2 + ) + foodtypes = GRAIN | FRUIT + +/obj/item/food/breadslice/custom + name = "bread slice" + icon_state = "tofubreadslice" + foodtypes = GRAIN + +/obj/item/food/baguette + name = "baguette" + desc = "Bon appetit!" + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "baguette" + item_state = null + worn_icon_state = "baguette" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 3 + ) + bite_consumption = 3 + w_class = WEIGHT_CLASS_NORMAL + slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT + attack_verb = list("touche") + tastes = list("bread" = 1) + foodtypes = GRAIN + +/obj/item/food/baguette/mime + name = "French Baguette" + desc = "It would be a shame if it was consumed by someone unworthy..." + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/nothing = 2 + ) + bite_consumption = null + +/obj/item/food/garlicbread + name = "garlic bread" + desc = "Alas, it is limited." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "garlicbread" + item_state = null + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/garlic = 2 + ) + bite_consumption = 3 + tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) + foodtypes = GRAIN + +/obj/item/food/deepfryholder + name = "Deep Fried Foods Holder Obj" + desc = "If you can see this description the code for the deep fryer fucked up." + icon = 'icons/obj/food/food.dmi' + icon_state = "" + bite_consumption = 2 + +/obj/item/food/deepfryholder/make_edible() + AddComponent(/datum/component/edible,\ + initial_reagents = food_reagents,\ + food_flags = food_flags,\ + foodtypes = foodtypes,\ + volume = max_volume,\ + eat_time = eat_time,\ + tastes = tastes,\ + eatverbs = eatverbs,\ + bite_consumption = bite_consumption,\ + on_consume = CALLBACK(src, PROC_REF(On_Consume))) + + +/obj/item/food/deepfryholder/Initialize(mapload, obj/item/fried) + . = ..() + name = fried.name //We'll determine the other stuff when it's actually removed + appearance = fried.appearance + layer = initial(layer) + plane = initial(plane) + lefthand_file = fried.lefthand_file + righthand_file = fried.righthand_file + worn_icon_state = fried.worn_icon_state + desc = fried.desc + w_class = fried.w_class + slowdown = fried.slowdown + equip_delay_self = fried.equip_delay_self + equip_delay_other = fried.equip_delay_other + strip_delay = fried.strip_delay + species_exception = fried.species_exception + item_flags = fried.item_flags + obj_flags = fried.obj_flags + inhand_x_dimension = fried.inhand_x_dimension + inhand_y_dimension = fried.inhand_y_dimension + + if(!(SEND_SIGNAL(fried, COMSIG_ITEM_FRIED, src) & COMSIG_FRYING_HANDLED)) //If frying is handled by signal don't do the defaault behavior. + fried.forceMove(src) + + +/obj/item/food/deepfryholder/Destroy() + if(contents) + QDEL_LIST(contents) + return ..() + +/obj/item/food/deepfryholder/proc/On_Consume(eater, feeder) + if(contents) + QDEL_LIST(contents) + + +/obj/item/food/deepfryholder/proc/fry(cook_time = 30) + switch(cook_time) + if(0 to 15) + add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) + name = "lightly-fried [name]" + desc = "[desc] It's been lightly fried in a deep fryer." + if(16 to 49) + add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) + name = "fried [name]" + desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%." + if(50 to 59) + add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) + name = "deep-fried [name]" + desc = "[desc] Deep-fried to perfection." + if(60 to INFINITY) + add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) + name = "\proper the physical manifestation of the very concept of fried foods" + desc = "A heavily-fried... something. Who can tell anymore?" + foodtypes |= FRIED + +/obj/item/food/butterbiscuit + name = "butter biscuit" + desc = "Well butter my biscuit!" + icon = 'icons/obj/food/food.dmi' + icon_state = "butterbiscuit" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 1 + ) + tastes = list("butter" = 1, "biscuit" = 1) + foodtypes = GRAIN | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/butterdog + name = "butterdog" + desc = "Made from exotic butters." + icon = 'icons/obj/food/food.dmi' + icon_state = "butterdog" + bite_consumption = 1 + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 1 + ) + tastes = list("butter" = 1, "exotic butter" = 1) + foodtypes = GRAIN | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/butterdog/ComponentInitialize() + . = ..() + AddComponent(/datum/component/slippery, 8 SECONDS) diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm new file mode 100644 index 000000000000..7bfd1c7f0ec1 --- /dev/null +++ b/code/game/objects/items/food/cake.dm @@ -0,0 +1,614 @@ +/obj/item/food/cake + icon = 'icons/obj/food/piecake.dmi' + bite_consumption = 3 + max_volume = 80 + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 5 + ) + tastes = list("cake" = 1) + foodtypes = GRAIN | DAIRY + /// type is spawned 5 at a time and replaces this cake when processed by cutting tool + var/obj/item/food/cakeslice/slice_type + /// changes yield of sliced cake, default for cake is 5 + var/yield = 5 + +/obj/item/food/cake/Initialize(mapload) + . = ..() + AddComponent(/datum/component/food_storage) + +/obj/item/food/cake/make_processable() + if (slice_type) + AddElement(/datum/element/processable, TOOL_KNIFE, slice_type, yield, 3 SECONDS, table_required = TRUE) + +/obj/item/food/cakeslice + icon = 'icons/obj/food/piecake.dmi' + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 1 + ) + tastes = list("cake" = 1) + foodtypes = GRAIN | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/cake/plain + name = "plain cake" + desc = "A plain cake, not a lie." //Many of the cakes seem to follow this desc scheme, so I am going to try and put either a hint about its contents, or a fun fact. Lets try to follow this. + icon_state = "plaincake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 30, + /datum/reagent/consumable/nutriment/vitamin = 7 + ) + tastes = list("sweetness" = 2, "cake" = 5) + foodtypes = GRAIN | DAIRY | SUGAR + slice_type = /obj/item/food/cakeslice/plain + +/obj/item/food/cakeslice/plain + name = "plain cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "plaincake_slice" + tastes = list("sweetness" = 2,"cake" = 5) + foodtypes = GRAIN | DAIRY | SUGAR + +/obj/item/food/cake/carrot + name = "carrot cake" + desc = "Scientifically proven to improve eyesight! Not a lie." + icon_state = "carrotcake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/medicine/oculine = 10, + /datum/reagent/consumable/nutriment/vitamin = 5 + ) + tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) + foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + slice_type = /obj/item/food/cakeslice/carrot + +/obj/item/food/cakeslice/carrot + name = "carrot cake slice" + desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie." + icon_state = "carrotcake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/medicine/oculine = 2, + /datum/reagent/consumable/nutriment/vitamin = 1 + ) + tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) + foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + +/obj/item/food/cake/brain + name = "brain cake" + desc = "Yeah... its actually made out of brain. I wish it were a lie." + icon_state = "braincake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 15, + /datum/reagent/medicine/mannitol = 10, + /datum/reagent/consumable/nutriment/vitamin = 5 + ) + tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) + foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR + slice_type = /obj/item/food/cakeslice/brain + +/obj/item/food/cakeslice/brain + name = "brain cake slice" + desc = "Lemme tell you something about prions. THEY'RE DELICIOUS. A terrifying not-lie." + icon_state = "braincakeslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/medicine/mannitol = 2, + /datum/reagent/consumable/nutriment/vitamin = 1 + ) + tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) + foodtypes = GRAIN | DAIRY | MEAT | GROSS | SUGAR + +/obj/item/food/cake/cheese + name = "cheese cake" + desc = "DANGEROUSLY cheesy." + icon_state = "cheesecake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 8 + ) + tastes = list("cake" = 4, "cream cheese" = 3) + foodtypes = GRAIN | DAIRY + slice_type = /obj/item/food/cakeslice/cheese + +/obj/item/food/cakeslice/cheese + name = "cheese cake slice" + desc = "Slice of pure cheestisfaction." + icon_state = "cheesecake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 1.3 + ) + tastes = list("cake" = 4, "cream cheese" = 3) + foodtypes = GRAIN | DAIRY + +/obj/item/food/cake/orange + name = "orange cake" + desc = "A cake with added orange." + icon_state = "orangecake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/orange + +/obj/item/food/cakeslice/orange + name = "orange cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "orangecake_slice" + tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cake/lime + name = "lime cake" + desc = "A cake with added lime." + icon_state = "limecake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/lime + +/obj/item/food/cakeslice/lime + name = "lime cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "limecake_slice" + tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cake/lemon + name = "lemon cake" + desc = "A cake with added lemon." + icon_state = "lemoncake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("cake" = 5, "sweetness" = 3, "sourness" = 1) //lemon cake is never as sour as it is sweet, have you ever actually eaten it? + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/lemon + +/obj/item/food/cakeslice/lemon + name = "lemon cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "lemoncake_slice" + tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cake/chocolate + name = "chocolate cake" + desc = "A cake with added chocolate." + icon_state = "chocolatecake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) + foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR + slice_type = /obj/item/food/cakeslice/chocolate + +/obj/item/food/cakeslice/chocolate + name = "chocolate cake slice" + desc = "Just a slice of cake, it is enough for everyone." + icon_state = "chocolatecake_slice" + tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) + foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR + +/obj/item/food/cake/birthday + name = "birthday cake" + desc = "Happy Birthday little clown..." + icon_state = "birthdaycake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/sprinkles = 10, + /datum/reagent/consumable/nutriment/vitamin = 5 + ) + tastes = list("cake" = 5, "sweetness" = 1) + foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR + slice_type = /obj/item/food/cakeslice/birthday + +/obj/item/food/cake/birthday/microwave_act(obj/machinery/microwave/M) //super sekrit club + new /obj/item/clothing/head/hardhat/cakehat(get_turf(src)) + qdel(src) + +/obj/item/food/cakeslice/birthday + name = "birthday cake slice" + desc = "A slice of your birthday." + icon_state = "birthdaycakeslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/sprinkles = 2, + /datum/reagent/consumable/nutriment/vitamin = 1 + ) + tastes = list("cake" = 5, "sweetness" = 1) + foodtypes = GRAIN | DAIRY | JUNKFOOD | SUGAR + +/obj/item/food/cake/birthday/energy + name = "energy cake" + desc = "Just enough calories for a whole nuclear operative squad." + icon_state = "energycake" + force = 5 + hitsound = 'sound/weapons/blade1.ogg' + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/sprinkles = 10, + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/consumable/pwr_game = 10, + /datum/reagent/consumable/liquidelectricity = 10 + ) + tastes = list("cake" = 3, "a Vlad's Salad" = 1) + slice_type = /obj/item/food/cakeslice/birthday/energy + +/obj/item/food/cake/birthday/energy/microwave_act(obj/machinery/microwave/M) //super sekriter club + new /obj/item/clothing/head/hardhat/cakehat/energycake(get_turf(src)) + qdel(src) + +/obj/item/food/cake/birthday/energy/proc/energy_bite(mob/living/user) + to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!") + user.apply_damage(30, BURN, BODY_ZONE_HEAD) // ITs an ENERGY sword, so it burns, duh + playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE) + +/obj/item/food/cake/birthday/energy/attack(mob/living/target_mob, mob/living/user) + . = ..() + if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly + return + energy_bite(target_mob, user) + +/obj/item/food/cakeslice/birthday/energy + name = "energy cake slice" + desc = "For the traitor on the go." + icon_state = "energycakeslice" + force = 2 + hitsound = 'sound/weapons/blade1.ogg' + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/sprinkles = 2, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/pwr_game = 2, + /datum/reagent/consumable/liquidelectricity = 2 + ) + tastes = list("cake" = 3, "a Vlad's Salad" = 1) + +/obj/item/food/cakeslice/birthday/energy/proc/energy_bite(mob/living/user) + to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!") + user.apply_damage(18, BURN, BODY_ZONE_HEAD) + playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE) + +/obj/item/food/cakeslice/birthday/energy/attack(mob/living/target_mob, mob/living/user) + . = ..() + if(HAS_TRAIT(user, TRAIT_PACIFISM) && target_mob != user) //Prevents pacifists from attacking others directly + return + energy_bite(target_mob, user) + +/obj/item/food/cake/apple + name = "apple cake" + desc = "A cake centred with Apple." + icon_state = "applecake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10 + ) + tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/apple + +/obj/item/food/cakeslice/apple + name = "apple cake slice" + desc = "A slice of heavenly cake." + icon_state = "applecakeslice" + tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cake/slimecake + name = "Slime cake" + desc = "A cake made of slimes. Probably not electrified." + icon_state = "slimecake" + tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) + foodtypes = GRAIN | DAIRY | SUGAR + slice_type = /obj/item/food/cakeslice/slimecake + +/obj/item/food/cakeslice/slimecake + name = "slime cake slice" + desc = "A slice of slime cake." + icon_state = "slimecake_slice" + tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) + foodtypes = GRAIN | DAIRY | SUGAR + +/obj/item/food/cake/pumpkinspice + name = "pumpkin spice cake" + desc = "A hollow cake with real pumpkin." + icon_state = "pumpkinspicecake" + tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) + foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + slice_type = /obj/item/food/cakeslice/pumpkinspice + +/obj/item/food/cakeslice/pumpkinspice + name = "pumpkin spice cake slice" + desc = "A spicy slice of pumpkin goodness." + icon_state = "pumpkinspicecakeslice" + tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) + foodtypes = GRAIN | DAIRY | VEGETABLES | SUGAR + +/obj/item/food/cake/bsvc // blackberry strawberries vanilla cake + name = "blackberry and strawberry vanilla cake" + desc = "A plain cake, filled with assortment of blackberries and strawberries!" + icon_state = "blackbarry_strawberries_cake_vanilla_cake" + tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/bsvc + +/obj/item/food/cakeslice/bsvc + name = "blackberry and strawberry vanilla cake slice" + desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" + icon_state = "blackbarry_strawberries_cake_vanilla_slice" + tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cake/bscc // blackbarry strawberries chocolate cake + name = "blackberry and strawberry chocolate cake" + desc = "A chocolate cake, filled with assortment of blackberries and strawberries!" + icon_state = "blackbarry_strawberries_cake_coco_cake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/consumable/cocoa = 5 + ) + tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 4, "sweetness" = 2,"cake" = 3) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/bscc + +/obj/item/food/cakeslice/bscc + name = "blackberry and strawberry chocolate cake slice" + desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" + icon_state = "blackbarry_strawberries_cake_coco_slice" + tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 4, "sweetness" = 2,"cake" = 3) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cake/holy_cake + name = "angel food cake" + desc = "A cake made for angels and chaplains alike! Contains holy water." + icon_state = "holy_cake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 1, + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/water/holywater = 10 + ) + tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) + foodtypes = GRAIN | DAIRY | SUGAR + slice_type = /obj/item/food/cakeslice/holy_cake_slice + +/obj/item/food/cakeslice/holy_cake_slice + name = "angel food cake slice" + desc = "A slice of heavenly cake." + icon_state = "holy_cake_slice" + tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) + foodtypes = GRAIN | DAIRY | SUGAR + +/obj/item/food/cake/pound_cake + name = "pound cake" + desc = "A condensed cake made for filling people up quickly." + icon_state = "pound_cake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 60, + /datum/reagent/consumable/nutriment/vitamin = 5 + ) + tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1) + foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD + slice_type = /obj/item/food/cakeslice/pound_cake_slice + yield = 10 //cause its so damn THICC (seriously these things are fucking huge a pound of each ingredient are you kidding) + +/obj/item/food/cakeslice/pound_cake_slice + name = "pound cake slice" + desc = "A slice of condensed cake made for filling people up quickly." + icon_state = "pound_cake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 9, + /datum/reagent/consumable/nutriment/vitamin = 0.5 + ) + tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1) + foodtypes = GRAIN | DAIRY | SUGAR | JUNKFOOD + +/obj/item/food/cake/hardware_cake + name = "hardware cake" + desc = "A quote on quote cake that is made with electronic boards and leaks acid..." + icon_state = "hardware_cake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/toxin/acid = 15, + /datum/reagent/oil = 15 + ) + tastes = list("acid" = 3, "metal" = 4, "glass" = 5) + foodtypes = GRAIN | GROSS + slice_type = /obj/item/food/cakeslice/hardware_cake_slice + +/obj/item/food/cakeslice/hardware_cake_slice + name = "hardware cake slice" + desc = "A slice of electronic boards and some acid." + icon_state = "hardware_cake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/toxin/acid = 3, + /datum/reagent/oil = 3 + ) + tastes = list("acid" = 3, "metal" = 4, "glass" = 5) + foodtypes = GRAIN | GROSS + +/obj/item/food/cake/vanilla_cake + name = "vanilla cake" + desc = "A vanilla frosted cake." + icon_state = "vanillacake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/consumable/sugar = 15, + /datum/reagent/consumable/vanilla = 15 + ) + tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) + foodtypes = GRAIN | SUGAR | DAIRY + slice_type = /obj/item/food/cakeslice/vanilla_slice + +/obj/item/food/cakeslice/vanilla_slice + name = "vanilla cake slice" + desc = "A slice of vanilla frosted cake." + icon_state = "vanillacake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/sugar = 3, + /datum/reagent/consumable/vanilla = 3 + ) + tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) + foodtypes = GRAIN | SUGAR | DAIRY + +/obj/item/food/cake/clown_cake + name = "clown cake" + desc = "A funny cake with a clown face on it." + icon_state = "clowncake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/consumable/banana = 15 + ) + tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) + foodtypes = GRAIN | SUGAR | DAIRY + slice_type = /obj/item/food/cakeslice/clown_slice + +/obj/item/food/cakeslice/clown_slice + name = "clown cake slice" + desc = "A slice of bad jokes, and silly props." + icon_state = "clowncake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/banana = 3 + ) + tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) + foodtypes = GRAIN | SUGAR | DAIRY + +/obj/item/food/cake/trumpet + name = "spaceman's cake" + desc = "A spaceman's trumpet frosted cake." + icon_state = "trumpetcake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/medicine/polypyr = 15, + /datum/reagent/consumable/cream = 5, + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/consumable/berryjuice = 5 + ) + tastes = list("cake" = 4, "violets" = 2, "jam" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/trumpet + +/obj/item/food/cakeslice/trumpet + name = "spaceman's cake" + desc = "A spaceman's trumpet frosted cake." + icon_state = "trumpetcakeslice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/medicine/polypyr = 3, + /datum/reagent/consumable/cream = 1, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/berryjuice = 1 + ) + tastes = list("cake" = 4, "violets" = 2, "jam" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cake/brioche + name = "brioche cake" + desc = "A ring of sweet, glazed buns." + icon_state = "briochecake" + tastes = list("cake" = 4, "butter" = 2, "cream" = 1) + foodtypes = GRAIN | DAIRY | SUGAR + slice_type = /obj/item/food/cakeslice/brioche + yield = 6 + +/obj/item/food/cakeslice/brioche + name = "brioche cake slice" + desc = "Delicious sweet-bread. Who needs anything else?" + icon_state = "briochecake_slice" + +/* +/obj/item/food/cake/pavlova + name = "pavlova" + desc = "A sweet berry pavlova. Invented in New Zealand, but named after a Russian ballerina... And scientifically proven to be the best at dinner parties!" + icon_state = "pavlova" + tastes = list("meringue" = 5, "creaminess" = 1, "berries" = 1) + foodtypes = DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/pavlova + +/obj/item/food/cake/pavlova/nuts + name = "pavlova with nuts" + foodtypes = NUTS | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/pavlova/nuts + +/obj/item/food/cakeslice/pavlova + name = "pavlova slice" + desc = "A cracked slice of pavlova stacked with berries. \ + You even got it sliced in such a way that more berries ended up on your slice, how delightfully devilish." + icon_state = "pavlova_slice" + tastes = list("meringue" = 5, "creaminess" = 1, "berries" = 1) + foodtypes = DAIRY | FRUIT | SUGAR + +/obj/item/food/cakeslice/pavlova/nuts + foodtypes = NUTS | FRUIT | SUGAR + +/obj/item/food/cake/fruit + name = "english fruitcake" + desc = "A proper good cake, innit?" + icon_state = "fruitcake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 15, + /datum/reagent/consumable/sugar = 10, + /datum/reagent/consumable/cherryjelly = 5, + ) + tastes = list("dried fruit" = 5, "treacle" = 2, "christmas" = 2) + force = 7 + throwforce = 7 + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + slice_type = /obj/item/food/cakeslice/fruit + +/obj/item/food/cakeslice/fruit + name = "english fruitcake slice" + desc = "A proper good slice, innit?" + icon_state = "fruitcake_slice1" + base_icon_state = "fruitcake_slice" + tastes = list("dried fruit" = 5, "treacle" = 2, "christmas" = 2) + force = 2 + throwforce = 2 + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + +/obj/item/food/cakeslice/fruit/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state][rand(1,3)]" + +/obj/item/food/cake/plum + name = "plum cake" + desc = "A cake centred with Plums." + icon_state = "plumcake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 20, + /datum/reagent/consumable/nutriment/vitamin = 10, + /datum/reagent/impurity/rosenol = 8, + ) + tastes = list("cake" = 5, "sweetness" = 1, "plum" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR + venue_value = FOOD_PRICE_CHEAP + slice_type = /obj/item/food/cakeslice/plum + +/obj/item/food/cakeslice/plum + name = "plum cake slice" + desc = "A slice of plum cake." + icon_state = "plumcakeslice" + tastes = list("cake" = 5, "sweetness" = 1, "plum" = 2) + foodtypes = GRAIN | DAIRY | FRUIT | SUGAR +*/ diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm new file mode 100644 index 000000000000..077bde7f65be --- /dev/null +++ b/code/game/objects/items/food/spaghetti.dm @@ -0,0 +1,137 @@ +/obj/item/food/spaghetti + icon = 'icons/obj/food/pizzaspaghetti.dmi' + food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + foodtypes = GRAIN + +/obj/item/food/spaghetti/Initialize() + . = ..() + if(!microwaved_type) // This isn't cooked, why would you put uncooked spaghetti in your pocket? + var/list/display_message = list( + "Something wet falls out of their pocket and hits the ground. Is that... [name]?", + "Oh shit! All your pocket [name] fell out!") + AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg') + +/obj/item/food/spaghetti/raw + name = "spaghetti" + desc = "Now that's a nic'e pasta!" + icon_state = "spaghetti" + tastes = list("pasta" = 1) + microwaved_type = /obj/item/food/spaghetti/boiledspaghetti + +/obj/item/food/spaghetti/boiledspaghetti + name = "boiled spaghetti" + desc = "A plain dish of noodles, this needs more ingredients." + icon_state = "spaghettiboiled" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) + microwaved_type = null + +/obj/item/food/spaghetti/pastatomato + name = "spaghetti" + desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" + icon_state = "pastatomato" + trash_type = /obj/item/trash/plate + bite_consumption = 4 + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4) + microwaved_type = null + tastes = list("pasta" = 1, "tomato" = 1) + foodtypes = GRAIN | VEGETABLES + +/obj/item/food/spaghetti/copypasta + name = "copypasta" + desc = "You probably shouldn't try this, you always hear people talking about how bad it is..." + icon_state = "copypasta" + trash_type = /obj/item/trash/plate + bite_consumption = 4 + food_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/tomatojuice = 20, /datum/reagent/consumable/nutriment/vitamin = 8) + microwaved_type = null + tastes = list("pasta" = 1, "tomato" = 1) + foodtypes = GRAIN | VEGETABLES + +/obj/item/food/spaghetti/meatballspaghetti + name = "spaghetti and meatballs" + desc = "Now that's a nic'e meatball!" + icon_state = "meatballspaghetti" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) + microwaved_type = null + tastes = list("pasta" = 1, "meat" = 1) + foodtypes = GRAIN | MEAT + +/obj/item/food/spaghetti/spesslaw + name = "spesslaw" + desc = "A lawyers favourite." + icon_state = "spesslaw" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 3) + microwaved_type = null + tastes = list("pasta" = 1, "meat" = 1) + +/obj/item/food/spaghetti/chowmein + name = "chow mein" + desc = "A nice mix of noodles and fried vegetables." + icon_state = "chowmein" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 6) + microwaved_type = null + tastes = list("noodle" = 1, "tomato" = 1) + +/obj/item/food/spaghetti/beefnoodle + name = "beef noodle" + desc = "Nutritious, beefy and noodly." + icon_state = "beefnoodle" + trash_type = /obj/item/reagent_containers/glass/bowl + food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3) + microwaved_type = null + tastes = list("noodle" = 1, "meat" = 1) + foodtypes = GRAIN | MEAT + +/obj/item/food/spaghetti/butternoodles + name = "butter noodles" + desc = "Noodles covered in savory butter. Simple and slippery, but delicious." + icon_state = "butternoodles" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 9, /datum/reagent/consumable/nutriment/vitamin = 2) + microwaved_type = null + tastes = list("noodle" = 1, "butter" = 1) + foodtypes = GRAIN | DAIRY + +/obj/item/food/spaghetti/kasespatzle + name = "käsespätzle" + desc = "A special kind of pasta made with eggs, served with tasty cheese." + icon_state = "kasespatzle" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4) + microwaved_type = null + tastes = list("pasta" = 1, "cheese" = 1, "egg" = 1) + foodtypes = GRAIN | DAIRY + +/obj/item/food/spaghetti/spaghettinapolitan + name = "spaghetti napolitan" + desc = "The only excuse to ever put ketchup into your spaghetti." + icon_state = "spaghettinapolitan" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6) + microwaved_type = null + tastes = list("pasta" = 1, "ketchup" = 1, "sausage" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES + +/obj/item/food/spaghetti/lasagna + name = "lasagna" + desc = "Somewhere, in some different universe, a cat is smoking your pipe." + icon_state = "lasagna" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 5, /datum/reagent/consumable/nutriment/vitamin = 4) + microwaved_type = null + tastes = list("pasta" = 1, "tomato" = 1, "cheese" = 1, "mondays" = 1) + foodtypes = GRAIN | DAIRY | VEGETABLES | MEAT + +/obj/item/food/spaghetti/glassnoodles + name = "glass noodles" + desc = "Noodles so transparent, you can see through them!" + icon_state = "glassnoodles" + trash_type = /obj/item/trash/plate + food_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 6) + microwaved_type = null + tastes = list("noodle" = 1, "sweetness" = 1, "tofu" = 1) + foodtypes = GRAIN | VEGETABLES diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 2732e0d37719..b7b5b27697d2 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -85,6 +85,7 @@ item_flags = EYE_STAB var/bayonet = FALSE //Can this be attached to a gun? custom_price = 250 + tool_behaviour = TOOL_KNIFE /obj/item/kitchen/knife/ComponentInitialize() . = ..() diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index dc3d2deff0ba..2cc81075125c 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -515,6 +515,14 @@ /obj/item/storage/bag/bio/holding/ComponentInitialize() . = ..() - var/datum/component/storage/storage = GetComponent(/datum/component/storage) - storage.max_combined_w_class = INFINITY - storage.max_items = 150 + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.max_combined_w_class = 32 + STR.max_items = 32 + STR.display_numerical_stacking = FALSE + STR.can_hold = typecacheof (list( /obj/item/mail, + /obj/item/small_delivery, + /obj/item/paper, + /obj/item/reagent_containers/food/condiment/milk, + /obj/item/food/bread/plain + )) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 157f9c611f30..b4c4fef265fa 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -503,7 +503,7 @@ /obj/item/reagent_containers/food/snacks/cheesynachos, /obj/item/reagent_containers/food/snacks/cubannachos, /obj/item/reagent_containers/food/snacks/nugget, - /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato, + /obj/item/food/spaghetti/pastatomato, /obj/item/reagent_containers/food/snacks/rofflewaffles, /obj/item/reagent_containers/food/snacks/donkpocket, /obj/item/reagent_containers/food/drinks/soda_cans/cola, diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index d0e946ba2a6e..969a41601fbb 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -2,7 +2,7 @@ name = "Birthday Cake" description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" reward = 4000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday) + wanted_types = list(/obj/item/food/cake/birthday, /obj/item/food/cakeslice/birthday) /datum/bounty/item/chef/soup name = "Soup" @@ -43,7 +43,7 @@ name = "Bread" description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." reward = 1000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/bread, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase) + wanted_types = list(/obj/item/food/bread, /obj/item/food/breadslice, /obj/item/reagent_containers/food/snacks/bun, /obj/item/reagent_containers/food/snacks/pizzabread, /obj/item/reagent_containers/food/snacks/rawpastrybase) /datum/bounty/item/chef/pie name = "Pie" diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 64bb4fdae667..73d3519a138d 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -10,7 +10,7 @@ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' pickup_sound = 'sound/items/handling/bottle_pickup.ogg' drop_sound = 'sound/items/handling/bottle_drop.ogg' - reagent_flags = OPENCONTAINER | DUNKABLE + reagent_flags = OPENCONTAINER | DUNKABLE | DUNKABLE var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it. possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index c4daa88869a7..bdfaff13e0bb 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -42,7 +42,7 @@ 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/pizzaslice/custom) || istype(I, /obj/item/reagent_containers/food/snacks/cakeslice/custom)) + else if(istype(I, /obj/item/reagent_containers/food/snacks/pizzaslice/custom)) to_chat(user, "Adding [I.name] to [src] would make a mess.") else if(!user.transferItemToLoc(I, src)) @@ -161,27 +161,6 @@ icon_state = "custburg" foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/customizable/bread - name = "bread" - ingMax = 6 - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/custom - slices_num = 5 - icon = 'icons/obj/food/burgerbread.dmi' - icon_state = "tofubread" - foodtype = GRAIN - - -/obj/item/reagent_containers/food/snacks/customizable/cake - name = "cake" - ingMax = 6 - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/custom - slices_num = 5 - icon = 'icons/obj/food/piecake.dmi' - icon_state = "plaincake" - foodtype = GRAIN | DAIRY - - /obj/item/reagent_containers/food/snacks/customizable/kebab name = "kebab" desc = "Delicious food on a stick." @@ -230,43 +209,6 @@ icon_state = "bowl" -/obj/item/reagent_containers/food/snacks/customizable/sandwich - name = "toast" - desc = "A timeless classic." - ingredients_placement = INGREDIENTS_STACK - icon = 'icons/obj/food/burgerbread.dmi' - icon_state = "breadslice" - var/finished = 0 - foodtype = GRAIN - -/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/breadslice)) //we're finishing the custom food. - var/obj/item/reagent_containers/food/snacks/breadslice/BS = I - if(finished) - return - to_chat(user, "You finish the [src.name].") - finished = 1 - name = "[customname] sandwich" - BS.reagents.trans_to(src, BS.reagents.total_volume, transfered_by = user) - 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/breadslice/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 - ..() - - /obj/item/reagent_containers/food/snacks/customizable/soup name = "soup" desc = "A bowl with liquid and... stuff in it." diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 2dd04174ba85..fb3525a795bb 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -45,7 +45,6 @@ All foods are distributed among various categories. Use common sense. var/eatverb var/dried_type = null var/dry = 0 - var/dunk_amount = 10 // how much reagent is transferred per dunk var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving var/filling_color = "#FFFFFF" //color to use when added to custom food. var/custom_food_type = null //for food customizing. path of the custom food to create @@ -56,6 +55,16 @@ All foods are distributed among various categories. Use common sense. //Placeholder for effect that trigger on eating that aren't tied to reagents. +/obj/item/reagent_containers/food/snacks/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ITEM_FRIED, PROC_REF(on_fried)) + + +/obj/item/reagent_containers/food/snacks/proc/on_fried(fry_object) + reagents.trans_to(fry_object, reagents.total_volume) + qdel() + return COMSIG_FRYING_HANDLED + /obj/item/reagent_containers/food/snacks/add_initial_reagents() if(tastes && tastes.len) if(list_reagents) @@ -174,7 +183,7 @@ All foods are distributed among various categories. Use common sense. if(S.w_class > WEIGHT_CLASS_SMALL) to_chat(user, "[S] is too big for [src]!") return 0 - if(!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom) || istype(W, /obj/item/reagent_containers/food/snacks/cakeslice/custom)) + if(!S.customfoodfilling || istype(W, /obj/item/reagent_containers/food/snacks/customizable) || istype(W, /obj/item/reagent_containers/food/snacks/pizzaslice/custom)) to_chat(user, "[src] can't be filled with [S]!") return 0 if(contents.len >= 20) @@ -331,31 +340,14 @@ All foods are distributed among various categories. Use common sense. M.emote(sattisfaction_text) qdel(src) - // //////////////////////////////////////////////Store//////////////////////////////////////// /// All the food items that can store an item inside itself, like bread or cake. /obj/item/reagent_containers/food/snacks/store w_class = WEIGHT_CLASS_NORMAL - var/stored_item = 0 -/obj/item/reagent_containers/food/snacks/store/attackby(obj/item/W, mob/user, params) - ..() - if(W.w_class <= WEIGHT_CLASS_SMALL & !istype(W, /obj/item/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods. - if(W.get_sharpness()) - return 0 - if(stored_item) - return 0 - if(!iscarbon(user)) - return 0 - if(contents.len >= 20) - to_chat(user, "[src] is full.") - return 0 - to_chat(user, "You slip [W] inside [src].") - user.transferItemToLoc(W, src) - add_fingerprint(user) - contents += W - stored_item = 1 - return 1 // no afterattack here +/obj/item/reagent_containers/food/snacks/store/Initialize() + . = ..() + AddComponent(/datum/component/food_storage) /obj/item/reagent_containers/food/snacks/MouseDrop(atom/over) var/turf/T = get_turf(src) diff --git a/code/modules/food_and_drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm index 9567690dc71c..4f5f06379927 100644 --- a/code/modules/food_and_drinks/food/snacks/dough.dm +++ b/code/modules/food_and_drinks/food/snacks/dough.dm @@ -7,7 +7,7 @@ desc = "A piece of dough." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "dough" - cooked_type = /obj/item/reagent_containers/food/snacks/store/bread/plain + cooked_type = /obj/item/food/bread/plain list_reagents = list(/datum/reagent/consumable/nutriment = 6) w_class = WEIGHT_CLASS_NORMAL tastes = list("dough" = 1) @@ -82,7 +82,7 @@ desc = "Cook it to get a cake." icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "cakebatter" - cooked_type = /obj/item/reagent_containers/food/snacks/store/cake/plain + cooked_type = /obj/item/food/cake/plain list_reagents = list(/datum/reagent/consumable/nutriment = 9) w_class = WEIGHT_CLASS_NORMAL tastes = list("batter" = 1) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm deleted file mode 100644 index 13342a968900..000000000000 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ /dev/null @@ -1,302 +0,0 @@ - -/obj/item/reagent_containers/food/snacks/store/bread - icon = 'icons/obj/food/burgerbread.dmi' - volume = 80 - slices_num = 5 - tastes = list("bread" = 10) - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/store/bread/Initialize() - . = ..() - AddElement(/datum/element/dunkable, 10) - -/obj/item/reagent_containers/food/snacks/breadslice - icon = 'icons/obj/food/burgerbread.dmi' - bitesize = 2 - custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/sandwich - filling_color = "#FFA500" - list_reagents = list(/datum/reagent/consumable/nutriment = 2) - slot_flags = ITEM_SLOT_HEAD - customfoodfilling = 0 //to avoid infinite bread-ception - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/breadslice/Initialize() - . = ..() - AddElement(/datum/element/dunkable, 10) - -/obj/item/reagent_containers/food/snacks/store/bread/plain - name = "bread" - desc = "Some plain old earthen bread." - icon_state = "bread" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 7) - list_reagents = list(/datum/reagent/consumable/nutriment = 10) - custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/bread - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/plain - tastes = list("bread" = 10) - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/breadslice/plain - name = "bread slice" - desc = "A slice of home." - icon_state = "breadslice" - customfoodfilling = 1 - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/breadslice/moldy - name = "moldy bread slice" - desc = "Entire stations have been ripped apart over arguing whether this is still good to eat." - icon_state = "moldybreadslice" - customfoodfilling = 0 - bonus_reagents = list(/datum/reagent/consumable/mold = 10) - tastes = list("decaying fungus" = 1) - foodtype = GROSS - -/obj/item/reagent_containers/food/snacks/store/bread/meat - name = "meatbread loaf" - desc = "The culinary base of every self-respecting eloquen/tg/entleman." - icon_state = "meatbread" - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/meat - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) - list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("bread" = 10, "meat" = 10) - foodtype = GRAIN | MEAT - -/obj/item/reagent_containers/food/snacks/breadslice/meat - name = "meatbread slice" - desc = "A slice of delicious meatbread." - icon_state = "meatbreadslice" - foodtype = GRAIN | MEAT - -/obj/item/reagent_containers/food/snacks/store/bread/xenomeat - name = "xenomeatbread loaf" - desc = "The culinary base of every self-respecting eloquen/tg/entleman. Extra Heretical." - icon_state = "xenomeatbread" - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/xenomeat - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) - list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("bread" = 10, "acid" = 10) - foodtype = GRAIN | MEAT - -/obj/item/reagent_containers/food/snacks/breadslice/xenomeat - name = "xenomeatbread slice" - desc = "A slice of delicious meatbread. Extra Heretical." - icon_state = "xenobreadslice" - filling_color = "#32CD32" - list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) - foodtype = GRAIN | MEAT - -/obj/item/reagent_containers/food/snacks/store/bread/spidermeat - name = "spider meat loaf" - desc = "Reassuringly green meatloaf made from spider meat." - icon_state = "spidermeatbread" - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/spidermeat - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) - list_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/toxin = 15, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("bread" = 10, "cobwebs" = 5) - foodtype = GRAIN | MEAT | TOXIC - -/obj/item/reagent_containers/food/snacks/breadslice/spidermeat - name = "spider meat bread slice" - desc = "A slice of meatloaf made from an animal that most likely still wants you dead." - icon_state = "spiderbreadslice" - filling_color = "#7CFC00" - list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/toxin = 3, /datum/reagent/consumable/nutriment/vitamin = 1) - foodtype = GRAIN | MEAT | TOXIC - -/obj/item/reagent_containers/food/snacks/store/bread/banana - name = "banana-nut bread" - desc = "A heavenly and filling treat." - icon_state = "bananabread" - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/banana - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/banana = 20) - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/banana = 20) - tastes = list("bread" = 10) // bananjuice will also flavour - foodtype = GRAIN | FRUIT - - -/obj/item/reagent_containers/food/snacks/breadslice/banana - name = "banana-nut bread slice" - desc = "A slice of delicious banana bread." - icon_state = "bananabreadslice" - filling_color = "#FFD700" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/banana = 4) - foodtype = GRAIN | FRUIT - -/obj/item/reagent_containers/food/snacks/store/bread/tofu - name = "Tofubread" - desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers." - icon_state = "tofubread" - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/tofu - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 10) - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("bread" = 10, "tofu" = 10) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/breadslice/tofu - name = "tofubread slice" - desc = "A slice of delicious tofubread." - icon_state = "tofubreadslice" - filling_color = "#FF8C00" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/store/bread/creamcheese - name = "cream cheese bread" - desc = "Yum yum yum!" - icon_state = "creamcheesebread" - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/creamcheese - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("bread" = 10, "cheese" = 10) - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/breadslice/creamcheese - name = "cream cheese bread slice" - desc = "A slice of yum!" - icon_state = "creamcheesebreadslice" - filling_color = "#FF8C00" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/store/bread/mimana - name = "mimana bread" - desc = "Best eaten in silence." - icon_state = "mimanabread" - slice_path = /obj/item/reagent_containers/food/snacks/breadslice/mimana - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5) - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/consumable/nothing = 5, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("bread" = 10, "silence" = 10) - foodtype = GRAIN | FRUIT - -/obj/item/reagent_containers/food/snacks/breadslice/mimana - name = "mimana bread slice" - desc = "A slice of silence!" - icon_state = "mimanabreadslice" - filling_color = "#C0C0C0" - list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nutriment/vitamin = 1) - foodtype = GRAIN | FRUIT - -/obj/item/reagent_containers/food/snacks/breadslice/custom - name = "bread slice" - icon_state = "tofubreadslice" - filling_color = "#FFFFFF" - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/baguette - name = "baguette" - desc = "Bon appetit!" - icon = 'icons/obj/food/burgerbread.dmi' - icon_state = "baguette" - item_state = "baguette" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) - bitesize = 3 - w_class = WEIGHT_CLASS_NORMAL - slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT - attack_verb = list("touche'd") - tastes = list("bread" = 1) - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/garlicbread - name = "garlic bread" - desc = "Alas, it is limited." - icon = 'icons/obj/food/burgerbread.dmi' - icon_state = "garlicbread" - item_state = "garlicbread" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/garlic = 2) - bitesize = 3 - tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/deepfryholder - name = "Deep Fried Foods Holder Obj" - desc = "If you can see this description the code for the deep fryer fucked up." - icon = 'icons/obj/food/food.dmi' - icon_state = "" - bitesize = 2 - -/obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried) - . = ..() - name = fried.name //We'll determine the other stuff when it's actually removed - appearance = fried.appearance - layer = initial(layer) - plane = initial(plane) - lefthand_file = fried.lefthand_file - righthand_file = fried.righthand_file - item_state = fried.item_state - desc = fried.desc - w_class = fried.w_class - slowdown = fried.slowdown - equip_delay_self = fried.equip_delay_self - equip_delay_other = fried.equip_delay_other - strip_delay = fried.strip_delay - species_exception = fried.species_exception - item_flags = fried.item_flags - obj_flags = fried.obj_flags - inhand_x_dimension = fried.inhand_x_dimension - inhand_y_dimension = fried.inhand_y_dimension - - if(istype(fried, /obj/item/reagent_containers/food/snacks)) - fried.reagents.trans_to(src, fried.reagents.total_volume) - qdel(fried) - else - fried.forceMove(src) - -/obj/item/reagent_containers/food/snacks/deepfryholder/Destroy() - if(contents) - QDEL_LIST(contents) - . = ..() - -/obj/item/reagent_containers/food/snacks/deepfryholder/On_Consume(mob/living/eater) - if(contents) - QDEL_LIST(contents) - ..() - -/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(cook_time = 30) - switch(cook_time) - if(0 to 15) - add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY) - name = "lightly-fried [name]" - desc = "[desc] It's been lightly fried in a deep fryer." - if(16 to 49) - add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) - name = "fried [name]" - desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%." - if(50 to 59) - add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY) - name = "deep-fried [name]" - desc = "[desc] Deep-fried to perfection." - if(60 to INFINITY) - add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY) - name = "\proper the physical manifestation of the very concept of fried foods" - desc = "A heavily-fried...something. Who can tell anymore?" - filling_color = color - foodtype |= FRIED - -/obj/item/reagent_containers/food/snacks/butterbiscuit - name = "butter biscuit" - desc = "Well butter my biscuit!" - icon = 'icons/obj/food/food.dmi' - icon_state = "butterbiscuit" - filling_color = "#F0E68C" - list_reagents = list(/datum/reagent/consumable/nutriment = 5) - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) - tastes = list("butter" = 1, "biscuit" = 1) - foodtype = GRAIN | BREAKFAST - -/obj/item/reagent_containers/food/snacks/butterdog - name = "butterdog" - desc = "Made from exotic butters." - icon = 'icons/obj/food/food.dmi' - icon_state = "butterdog" - bitesize = 1 - filling_color = "#F1F49A" - list_reagents = list(/datum/reagent/consumable/nutriment = 5) - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) - tastes = list("butter", "exotic butter") - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/butterdog/ComponentInitialize() - . = ..() - AddComponent(/datum/component/slippery, 80) diff --git a/code/modules/food_and_drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm deleted file mode 100644 index a048fb0e4371..000000000000 --- a/code/modules/food_and_drinks/food/snacks_cake.dm +++ /dev/null @@ -1,431 +0,0 @@ -/obj/item/reagent_containers/food/snacks/store/cake - icon = 'icons/obj/food/piecake.dmi' - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/plain - slices_num = 5 - bitesize = 3 - volume = 80 - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("cake" = 1) - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/cakeslice - icon = 'icons/obj/food/piecake.dmi' - trash = /obj/item/trash/plate - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) - customfoodfilling = 0 //to avoid infinite cake-ception - tastes = list("cake" = 1) - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/store/cake/plain - name = "plain cake" - desc = "A plain cake, not a lie." - icon_state = "plaincake" - custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/cake - bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2) - tastes = list("sweetness" = 2,"cake" = 5) - foodtype = GRAIN | DAIRY | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/plain - name = "plain cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "plaincake_slice" - filling_color = "#FFD700" - customfoodfilling = 1 - tastes = list("sweetness" = 2,"cake" = 5) - foodtype = GRAIN | DAIRY | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/carrot - name = "carrot cake" - desc = "A favorite desert of a certain wascally wabbit. Not a lie." - icon_state = "carrotcake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/carrot - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/medicine/oculine = 5, /datum/reagent/consumable/nutriment/vitamin = 10) - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/oculine = 10, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) - foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/carrot - name = "carrot cake slice" - desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie." - icon_state = "carrotcake_slice" - filling_color = "#FFA500" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/oculine = 2, /datum/reagent/consumable/nutriment/vitamin = 1) - tastes = list("cake" = 5, "sweetness" = 2, "carrot" = 1) - foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/brain - name = "brain cake" - desc = "A squishy cake-thing." - icon_state = "braincake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brain - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 10) - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/medicine/mannitol = 10, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) - foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/brain - name = "brain cake slice" - desc = "Lemme tell you something about prions. THEY'RE DELICIOUS." - icon_state = "braincakeslice" - filling_color = "#FF69B4" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/mannitol = 2, /datum/reagent/consumable/nutriment/vitamin = 1) - tastes = list("cake" = 5, "sweetness" = 2, "brains" = 1) - foodtype = GRAIN | DAIRY | MEAT | GROSS | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/cheese - name = "cheese cake" - desc = "DANGEROUSLY cheesy." - icon_state = "cheesecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/cheese - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 10) - tastes = list("cake" = 4, "cream cheese" = 3) - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/cakeslice/cheese - name = "cheese cake slice" - desc = "Slice of pure cheestisfaction." - icon_state = "cheesecake_slice" - filling_color = "#FFFACD" - tastes = list("cake" = 4, "cream cheese" = 3) - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/store/cake/orange - name = "orange cake" - desc = "A cake with added orange." - icon_state = "orangecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/orange - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) - tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/orange - name = "orange cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "orangecake_slice" - filling_color = "#FFA500" - tastes = list("cake" = 5, "sweetness" = 2, "oranges" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/lime - name = "lime cake" - desc = "A cake with added lime." - icon_state = "limecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lime - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) - tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/lime - name = "lime cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "limecake_slice" - filling_color = "#00FF00" - tastes = list("cake" = 5, "sweetness" = 2, "unbearable sourness" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/lemon - name = "lemon cake" - desc = "A cake with added lemon." - icon_state = "lemoncake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/lemon - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) - tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/lemon - name = "lemon cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "lemoncake_slice" - filling_color = "#FFEE00" - tastes = list("cake" = 5, "sweetness" = 2, "sourness" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/chocolate - name = "chocolate cake" - desc = "A cake with added chocolate." - icon_state = "chocolatecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/chocolate - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) - tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) - foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/chocolate - name = "chocolate cake slice" - desc = "Just a slice of cake, it is enough for everyone." - icon_state = "chocolatecake_slice" - filling_color = "#A0522D" - tastes = list("cake" = 5, "sweetness" = 1, "chocolate" = 4) - foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/birthday - name = "birthday cake" - desc = "Happy Birthday little clown..." - icon_state = "birthdaycake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5) - list_reagents = list(/datum/reagent/consumable/nutriment = 20, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("cake" = 5, "sweetness" = 1) - foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/birthday/microwave_act(obj/machinery/microwave/M) //super sekrit club - new /obj/item/clothing/head/hardhat/cakehat(get_turf(src)) - qdel(src) - -/obj/item/reagent_containers/food/snacks/cakeslice/birthday - name = "birthday cake slice" - desc = "A slice of your birthday." - icon_state = "birthdaycakeslice" - filling_color = "#DC143C" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1) - tastes = list("cake" = 5, "sweetness" = 1) - foodtype = GRAIN | DAIRY | JUNKFOOD | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy - name = "energy cake" - desc = "Just enough calories for a whole nuclear operative squad." - icon_state = "energycake" - force = 5 - hitsound = 'sound/weapons/blade1.ogg' - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy - list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/sprinkles = 10, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/pwr_game = 10, /datum/reagent/consumable/liquidelectricity = 10) - tastes = list("cake" = 3, "a Vlad's Salad" = 1) - -/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/proc/energy_bite(mob/living/user) - to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!") - user.apply_damage(30,BRUTE,BODY_ZONE_HEAD) - playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE) - -/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/attack(mob/living/M, mob/living/user) - . = ..() - if(HAS_TRAIT(user, TRAIT_PACIFISM) && M != user) //Prevents pacifists from attacking others directly - return - energy_bite(M, user) - -/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy/microwave_act(obj/machinery/microwave/M) //super sekriter club - new /obj/item/clothing/head/hardhat/cakehat/energycake(get_turf(src)) - qdel(src) - -/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy - name = "energy cake slice" - desc = "For the traitor on the go." - icon_state = "energycakeslice" - force = 2 - hitsound = 'sound/weapons/blade1.ogg' - filling_color = "#00FF00" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sprinkles = 2, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/pwr_game = 2, /datum/reagent/consumable/liquidelectricity = 2) - tastes = list("cake" = 3, "a Vlad's Salad" = 1) - -/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy/proc/energy_bite(mob/living/user) - to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!") - user.apply_damage(18,BRUTE,BODY_ZONE_HEAD) - playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE) - -/obj/item/reagent_containers/food/snacks/cakeslice/birthday/energy/attack(mob/living/M, mob/living/user) - . = ..() - if(HAS_TRAIT(user, TRAIT_PACIFISM) && M != user) //Prevents pacifists from attacking others directly - return - energy_bite(M, user) - -/obj/item/reagent_containers/food/snacks/store/cake/apple - name = "apple cake" - desc = "A cake centred with Apple." - icon_state = "applecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/apple - slices_num = 5 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 10) - tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/apple - name = "apple cake slice" - desc = "A slice of heavenly cake." - icon_state = "applecakeslice" - filling_color = "#FF4500" - tastes = list("cake" = 5, "sweetness" = 1, "apple" = 1) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/custom - name = "cake slice" - icon_state = "plaincake_slice" - filling_color = "#FFFFFF" - foodtype = GRAIN | DAIRY - -/obj/item/reagent_containers/food/snacks/store/cake/slimecake - name = "Slime cake" - desc = "A cake made of slimes. Probably not electrified." - icon_state = "slimecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/slimecake - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) - tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) - foodtype = GRAIN | DAIRY | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/slimecake - name = "slime cake slice" - desc = "A slice of slime cake." - icon_state = "slimecake_slice" - filling_color = "#00FFFF" - tastes = list("cake" = 5, "sweetness" = 1, "slime" = 1) - foodtype = GRAIN | DAIRY | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice - name = "pumpkin spice cake" - desc = "A hollow cake with real pumpkin." - icon_state = "pumpkinspicecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pumpkinspice - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 5) - tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) - foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/pumpkinspice - name = "pumpkin spice cake slice" - desc = "A spicy slice of pumpkin goodness." - icon_state = "pumpkinspicecakeslice" - filling_color = "#FFD700" - tastes = list("cake" = 5, "sweetness" = 1, "pumpkin" = 1) - foodtype = GRAIN | DAIRY | VEGETABLES | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/bsvc // blackberry strawberries vanilla cake - name = "blackberry and strawberry vanilla cake" - desc = "A plain cake, filled with assortment of blackberries and strawberries!" - icon_state = "blackbarry_strawberries_cake_vanilla_cake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bsvc - bonus_reagents = list(/datum/reagent/consumable/nutriment = 14, /datum/reagent/consumable/nutriment/vitamin = 4) - tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2, "cake" = 3) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/bsvc - name = "blackberry and strawberry vanilla cake slice" - desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" - icon_state = "blackbarry_strawberries_cake_vanilla_slice" - filling_color = "#FFD700" - tastes = list("blackberry" = 2, "strawberries" = 2, "vanilla" = 2, "sweetness" = 2,"cake" = 3) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/bscc // blackbarry strawberries chocolate cake - name = "blackberry and strawberry chocolate cake" - desc = "A chocolate cake, filled with assortment of blackberries and strawberries!" - icon_state = "blackbarry_strawberries_cake_coco_cake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/bscc - bonus_reagents = list(/datum/reagent/consumable/nutriment = 14, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/consumable/coco = 5) - tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/bscc - name = "blackberry and strawberry chocolate cake slice" - desc = "Just a slice of cake filled with assortment of blackberries and strawberries!" - icon_state = "blackbarry_strawberries_cake_coco_slice" - filling_color = "#FFD700" - tastes = list("blackberry" = 2, "strawberries" = 2, "chocolate" = 2, "sweetness" = 2,"cake" = 3) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/holy_cake - name = "angel food cake" - desc = "A cake made for angels and chaplains alike! Contains holy water." - icon_state = "holy_cake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/water/holywater = 10) - tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) - foodtype = GRAIN | DAIRY | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/holy_cake_slice - name = "angel food cake slice" - desc = "A slice of heavenly cake." - icon_state = "holy_cake_slice" - filling_color = "#00FFFF" - tastes = list("cake" = 5, "sweetness" = 1, "clouds" = 1) - foodtype = GRAIN | DAIRY | SUGAR - -/obj/item/reagent_containers/food/snacks/store/cake/pound_cake - name = "pound cake" - desc = "A condensed cake made for filling people up quickly." - icon_state = "pound_cake" - slices_num = 7 //Its ment to feed the party - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice - bonus_reagents = list(/datum/reagent/consumable/nutriment = 60) - tastes = list("cake" = 5, "sweetness" = 1, "batter" = 1) - foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD - -/obj/item/reagent_containers/food/snacks/cakeslice/pound_cake_slice - name = "pound cake slice" - desc = "A slice of condensed cake made for filling people up quickly." - icon_state = "pound_cake_slice" - filling_color = "#00FFFF" - tastes = list("cake" = 5, "sweetness" = 5, "batter" = 1) - foodtype = GRAIN | DAIRY | SUGAR | JUNKFOOD - -/obj/item/reagent_containers/food/snacks/store/cake/hardware_cake - name = "hardware cake" - desc = "A quote on quote cake that is made with electronic boards and leaks acid..." - icon_state = "hardware_cake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice - bonus_reagents = list(/datum/reagent/toxin/acid = 15, /datum/reagent/fuel/oil = 15) - tastes = list("acid" = 3, "metal" = 4, "glass" = 5) - foodtype = GRAIN | GROSS - -/obj/item/reagent_containers/food/snacks/cakeslice/hardware_cake_slice - name = "hardware cake slice" - desc = "A slice of electronic boards and some acid." - icon_state = "hardware_cake_slice" - filling_color = "#00FFFF" - tastes = list("acid" = 3, "metal" = 4, "glass" = 5) - foodtype = GRAIN | GROSS - -/obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake - name = "vanilla cake" - desc = "A vanilla frosted cake." - icon_state = "vanillacake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice - bonus_reagents = list(/datum/reagent/consumable/sugar = 15, /datum/reagent/consumable/vanilla = 15) - tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) - foodtype = GRAIN | SUGAR | DAIRY - -/obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice - name = "vanilla cake slice" - desc = "A slice of vanilla frosted cake." - icon_state = "vanillacake_slice" - filling_color = "#00FFFF" - tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10) - foodtype = GRAIN | SUGAR | DAIRY - -/obj/item/reagent_containers/food/snacks/store/cake/clown_cake - name = "clown cake" - desc = "A funny cake with a clown face on it." - icon_state = "clowncake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/clown_slice - bonus_reagents = list(/datum/reagent/consumable/sugar = 15) - tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) - foodtype = GRAIN | SUGAR | DAIRY - -/obj/item/reagent_containers/food/snacks/cakeslice/clown_slice - name = "clown cake slice" - desc = "A slice of bad jokes, and silly props." - icon_state = "clowncake_slice" - filling_color = "#00FFFF" - tastes = list("cake" = 1, "sugar" = 1, "joy" = 10) - foodtype = GRAIN | SUGAR | DAIRY - -/obj/item/reagent_containers/food/snacks/store/cake/trumpet - name = "spaceman's cake" - desc = "A spaceman's trumpet frosted cake." - icon_state = "trumpetcake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/trumpet - bonus_reagents = list(/datum/reagent/medicine/polypyr = 15, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/berryjuice = 5) - filling_color = "#7A3D80" - tastes = list("cake" = 4, "violets" = 2, "jam" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR - -/obj/item/reagent_containers/food/snacks/cakeslice/trumpet - name = "spaceman's cake" - desc = "A spaceman's trumpet frosted cake." - icon_state = "trumpetcakeslice" - filling_color = "#7A3D80" - tastes = list("cake" = 4, "violets" = 2, "jam" = 2) - foodtype = GRAIN | DAIRY | FRUIT | SUGAR diff --git a/code/modules/food_and_drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm index 360053c28ca4..ee28460adb62 100644 --- a/code/modules/food_and_drinks/food/snacks_egg.dm +++ b/code/modules/food_and_drinks/food/snacks_egg.dm @@ -10,6 +10,8 @@ filling_color = "#A0522D" tastes = list("chocolate" = 4, "sweetness" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/egg name = "egg" @@ -18,7 +20,8 @@ list_reagents = list(/datum/reagent/consumable/eggyolk = 5) cooked_type = /obj/item/reagent_containers/food/snacks/boiledegg filling_color = "#F0E68C" - foodtype = MEAT + foodtype = MEAT | RAW + w_class = WEIGHT_CLASS_TINY grind_results = list() var/static/chick_count = 0 //I copied this from the chicken_count (note the "en" in there) variable from chicken code. @@ -106,6 +109,8 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("egg" = 1) foodtype = MEAT | BREAKFAST + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/omelette //FUCK THIS name = "omelette du fromage" diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm index 930fabc31775..722d99debb7d 100644 --- a/code/modules/food_and_drinks/food/snacks_frozen.dm +++ b/code/modules/food_and_drinks/food/snacks_frozen.dm @@ -8,20 +8,24 @@ desc = "Portable Ice-cream in its own packaging." icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "icecreamsandwich" + w_class = WEIGHT_CLASS_TINY bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/ice = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2) tastes = list("ice cream" = 1) - foodtype = GRAIN | DAIRY | SUGAR + foodtype = GRAIN | DAIRY + /*food_flags = FOOD_FINGER_FOOD*/ /obj/item/reagent_containers/food/snacks/strawberryicecreamsandwich name = "strawberry ice cream sandwich" desc = "Portable ice-cream in its own packaging of the strawberry variety." icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "strawberryicecreamsandwich" + w_class = WEIGHT_CLASS_TINY bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2) tastes = list("ice cream" = 2, "berry" = 2) foodtype = FRUIT | DAIRY | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ /obj/item/reagent_containers/food/snacks/spacefreezy @@ -29,6 +33,7 @@ desc = "The best icecream in space." icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "spacefreezy" + w_class = WEIGHT_CLASS_TINY bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/bluecherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 4) filling_color = "#87CEFA" @@ -40,6 +45,7 @@ desc = "A classic dessert." icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "sundae" + w_class = WEIGHT_CLASS_SMALL bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 2) filling_color = "#FFFACD" @@ -66,12 +72,14 @@ desc = "It's just shaved ice. Still fun to chew on." icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "flavorless_sc" + w_class = WEIGHT_CLASS_SMALL trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups bonus_reagents = list(/datum/reagent/water = 10) //Base line will allways give water list_reagents = list(/datum/reagent/water = 1) // We dont get food for water/juices filling_color = "#FFFFFF" //Ice is white tastes = list("ice" = 1, "water" = 1) foodtype = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit + /*food_flags = FOOD_FINGER_FOOD*/ /obj/item/reagent_containers/food/snacks/snowcones/lime name = "lime snowcone" diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 510130ce08be..c088b2259610 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -211,6 +211,8 @@ filling_color = "#800000" tastes = list("meat" = 1) foodtype = MEAT + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/sausage name = "sausage" @@ -223,6 +225,7 @@ slices_num = 6 slice_path = /obj/item/reagent_containers/food/snacks/salami foodtype = MEAT | BREAKFAST + /*food_flags = FOOD_FINGER_FOOD*/ var/roasted = FALSE /obj/item/reagent_containers/food/snacks/sausage/Initialize() @@ -266,6 +269,8 @@ filling_color = "#CD853F" tastes = list("the jungle" = 1, "bananas" = 1) foodtype = MEAT | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY var/faction var/spawned_mob = /mob/living/carbon/monkey custom_price = 300 @@ -359,6 +364,8 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 2) tastes = list("\"chicken\"" = 1) foodtype = MEAT + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/nugget/Initialize() . = ..() diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 3d5adf18e6fd..9b00c74f5f4e 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -37,7 +37,9 @@ filling_color = "#FF1493" tastes = list("watermelon" = 1) foodtype = FRUIT + /*food_flags = FOOD_FINGER_FOOD*/ juice_results = list(/datum/reagent/consumable/watermelonjuice = 5) + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/candy_corn name = "candy corn" @@ -47,6 +49,8 @@ filling_color = "#FF8C00" tastes = list("candy corn" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/candy_corn/prison name = "desiccated candy corn" @@ -64,6 +68,8 @@ filling_color = "#A0522D" tastes = list("chocolate" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/hugemushroomslice name = "huge mushroom slice" @@ -120,6 +126,8 @@ filling_color = "FFD700" tastes = list("potato" = 3, "valids" = 1) foodtype = FRIED | VEGETABLES + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/tatortot/Initialize() . = ..() @@ -144,7 +152,7 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 6) filling_color = "#FFD700" tastes = list("fries" = 3, "cheese" = 1) - foodtype = VEGETABLES | GRAIN | DAIRY + foodtype = VEGETABLES | GRAIN /obj/item/reagent_containers/food/snacks/cheesyfries/Initialize() . = ..() @@ -192,6 +200,8 @@ list_reagents = list(/datum/reagent/toxin/minttoxin = 2) filling_color = "#800000" foodtype = TOXIC | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/eggwrap name = "egg wrap" @@ -229,6 +239,8 @@ filling_color = "#00800" tastes = list("cobwebs" = 1, "sugar" = 2) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/chococoin name = "chocolate coin" @@ -239,6 +251,8 @@ filling_color = "#A0522D" tastes = list("chocolate" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/fudgedice name = "fudge dice" @@ -250,6 +264,8 @@ trash = /obj/item/dice/fudge tastes = list("fudge" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/chocoorange name = "chocolate orange" @@ -260,6 +276,8 @@ filling_color = "#A0522D" tastes = list("chocolate" = 3, "oranges" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/eggplantparm name = "eggplant parmigiana" @@ -404,6 +422,8 @@ filling_color = "#F2CE91" tastes = list("oats" = 3, "nuts" = 2, "honey" = 1) foodtype = GRAIN | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/stuffedlegion name = "stuffed legion" @@ -484,6 +504,15 @@ next_succ = 0 tastes = list("candy" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + slot_flags = ITEM_SLOT_MASK + w_class = WEIGHT_CLASS_TINY + ///Essentially IsEquipped + var/chewing = TRUE + ///Time between bites + var/bite_frequency = 30 SECONDS + ///ID for timer + var/timer_id /obj/item/reagent_containers/food/snacks/chewable/lollipop/Initialize() . = ..() @@ -574,6 +603,8 @@ list_reagents = list(/datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/bicaridine = 2, /datum/reagent/medicine/kelotane = 2) //Kek tastes = list("candy") foodtype = JUNKFOOD + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/gumball/Initialize() . = ..() @@ -654,6 +685,7 @@ desc = "delicious, golden, fatty goodness on a stick." icon_state = "butteronastick" trash = /obj/item/stack/rods + /*food_flags = FOOD_FINGER_FOOD*/ /obj/item/reagent_containers/food/snacks/onionrings name = "onion rings" @@ -664,6 +696,7 @@ gender = PLURAL tastes = list("batter" = 3, "onion" = 1) foodtype = VEGETABLES + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/pineappleslice name = "pineapple slice" @@ -673,6 +706,7 @@ juice_results = list(/datum/reagent/consumable/pineapplejuice = 3) tastes = list("pineapple" = 1) foodtype = FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/tinychocolate name = "chocolate" diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index d060dc1c2969..ddc57e425b1a 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -13,6 +13,8 @@ filling_color = "#D2691E" tastes = list("donut" = 1) foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR | BREAKFAST + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL var/decorated_icon = "donut_homer" var/is_decorated = FALSE var/extra_reagent = null @@ -336,6 +338,8 @@ filling_color = "#F4A460" tastes = list("muffin" = 1) foodtype = GRAIN | SUGAR | BREAKFAST + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/muffin/berry name = "berry muffin" @@ -420,6 +424,8 @@ filling_color = "#CD853F" tastes = list("meat" = 2, "dough" = 2, "laziness" = 1) foodtype = GRAIN + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/donkpocket/warm name = "warm Donk-pocket" @@ -565,14 +571,13 @@ filling_color = "#F0E68C" tastes = list("cookie" = 1) foodtype = GRAIN | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/cookie/Initialize() . = ..() AddElement(/datum/element/dunkable, 10) -/obj/item/reagent_containers/food/snacks/cookie/sleepy - list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/toxin/chloralhydrate = 10) - /obj/item/reagent_containers/food/snacks/fortunecookie name = "fortune cookie" desc = "A true prophecy in each cookie!" @@ -582,6 +587,8 @@ filling_color = "#F4A460" tastes = list("cookie" = 1) foodtype = GRAIN | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/poppypretzel name = "poppy pretzel" @@ -592,6 +599,8 @@ filling_color = "#F0E68C" tastes = list("pretzel" = 1) foodtype = GRAIN | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit name = "plump helmet biscuit" @@ -602,6 +611,8 @@ filling_color = "#F0E68C" tastes = list("mushroom" = 1, "biscuit" = 1) foodtype = GRAIN | VEGETABLES + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/Initialize() var/fey = prob(10) @@ -623,6 +634,8 @@ filling_color = "#F0E68C" tastes = list("cracker" = 1) foodtype = GRAIN + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/hotdog name = "hotdog" @@ -711,21 +724,19 @@ name = "cherry cupcake" desc = "A sweet cupcake with cherry bits." icon_state = "cherrycupcake" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#F0E68C" tastes = list("cake" = 3, "cherry" = 1) foodtype = GRAIN | FRUIT | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL -/obj/item/reagent_containers/food/snacks/bluecherrycupcake +/obj/item/reagent_containers/food/snacks/cherrycupcake/blue name = "blue cherry cupcake" desc = "Blue cherries inside a delicious cupcake." icon_state = "bluecherrycupcake" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 3) - list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 1) - filling_color = "#F0E68C" tastes = list("cake" = 3, "blue cherry" = 1) - foodtype = GRAIN | FRUIT | SUGAR /obj/item/reagent_containers/food/snacks/honeybun name = "honey bun" diff --git a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm index c15a6606be97..169d208bf30d 100644 --- a/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm +++ b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm @@ -9,6 +9,8 @@ cooked_type = /obj/item/reagent_containers/food/snacks/toastedsandwich tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1) foodtype = GRAIN | VEGETABLES + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/toastedsandwich name = "toasted sandwich" @@ -31,6 +33,8 @@ list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 1) tastes = list("toast" = 1, "cheese" = 1) foodtype = GRAIN | DAIRY + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/jellysandwich name = "jelly sandwich" diff --git a/code/modules/food_and_drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm deleted file mode 100644 index 88c1188f1dee..000000000000 --- a/code/modules/food_and_drinks/food/snacks_spaghetti.dm +++ /dev/null @@ -1,106 +0,0 @@ - -/obj/item/reagent_containers/food/snacks/spaghetti - name = "spaghetti" - desc = "Now that's a nic'e pasta!" - icon = 'icons/obj/food/pizzaspaghetti.dmi' - icon_state = "spaghetti" - list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) - cooked_type = /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti - filling_color = "#F0E68C" - tastes = list("pasta" = 1) - foodtype = GRAIN - -/obj/item/reagent_containers/food/snacks/spaghetti/Initialize() - . = ..() - if(!cooked_type) // This isn't cooked, why would you put uncooked spaghetti in your pocket? - var/list/display_message = list( - "Something wet falls out of their pocket and hits the ground. Is that... [name]?", - "Oh shit! All your pocket [name] fell out!") - AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg') - -/obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti - name = "boiled spaghetti" - desc = "A plain dish of noodles, this needs more ingredients." - icon_state = "spaghettiboiled" - trash = /obj/item/trash/plate - bonus_reagents = list(/datum/reagent/consumable/nutriment = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) - cooked_type = null - custom_food_type = /obj/item/reagent_containers/food/snacks/customizable/pasta - -/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato - name = "spaghetti" - desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!" - icon_state = "pastatomato" - trash = /obj/item/trash/plate - bitesize = 4 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4) - list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4) - cooked_type = null - filling_color = "#DC143C" - tastes = list("pasta" = 1, "tomato" = 1) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/spaghetti/copypasta - name = "copypasta" - desc = "You probably shouldn't try this, you always hear people talking about how bad it is..." - icon_state = "copypasta" - trash = /obj/item/trash/plate - bitesize = 4 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) - list_reagents = list(/datum/reagent/consumable/nutriment = 12, /datum/reagent/consumable/tomatojuice = 20, /datum/reagent/consumable/nutriment/vitamin = 8) - cooked_type = null - filling_color = "#DC143C" - tastes = list("pasta" = 1, "tomato" = 1) - foodtype = GRAIN | VEGETABLES - -/obj/item/reagent_containers/food/snacks/spaghetti/meatballspaghetti - name = "spaghetti and meatballs" - desc = "Now that's a nic'e meatball!" - icon_state = "meatballspaghetti" - trash = /obj/item/trash/plate - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 4) - list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 4) - cooked_type = null - tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1) - foodtype = GRAIN | MEAT - -/obj/item/reagent_containers/food/snacks/spaghetti/spesslaw - name = "spesslaw" - desc = "A lawyers favourite." - icon_state = "spesslaw" - trash = /obj/item/trash/plate - bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 6) - list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 6) - cooked_type = null - tastes = list("pasta" = 1, "tomato" = 1, "meat" = 1) - -/obj/item/reagent_containers/food/snacks/spaghetti/chowmein - name = "chow mein" - desc = "A nice mix of noodles and fried vegetables." - icon_state = "chowmein" - trash = /obj/item/trash/plate - bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 4) - list_reagents = list(/datum/reagent/consumable/nutriment = 7, /datum/reagent/consumable/nutriment/vitamin = 6) - cooked_type = null - tastes = list("noodle" = 1, "tomato" = 1) - -/obj/item/reagent_containers/food/snacks/spaghetti/beefnoodle - name = "beef noodle" - desc = "Nutritious, beefy and noodly." - icon_state = "beefnoodle" - trash = /obj/item/reagent_containers/glass/bowl - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/liquidgibs = 3) - cooked_type = null - tastes = list("noodle" = 1, "meat" = 1) - foodtype = GRAIN | MEAT - -/obj/item/reagent_containers/food/snacks/spaghetti/butternoodles - name = "butter noodles" - desc = "Noodles covered in savory butter. Simple and slippery, but delicious." - icon_state = "butternoodles" - trash = /obj/item/trash/plate - bonus_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 1) - cooked_type = null - tastes = list("noodle" = 1, "butter" = 1) - foodtype = GRAIN | DAIRY diff --git a/code/modules/food_and_drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm index 8bff9db3384f..45a691deb982 100644 --- a/code/modules/food_and_drinks/food/snacks_vend.dm +++ b/code/modules/food_and_drinks/food/snacks_vend.dm @@ -12,6 +12,8 @@ filling_color = "#D2691E" tastes = list("candy" = 1) foodtype = JUNKFOOD | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_TINY /obj/item/reagent_containers/food/snacks/candy/bronx name = "South Bronx Paradise bar" @@ -82,7 +84,9 @@ filling_color = "#8B0000" tastes = list("dried raisins" = 1) foodtype = JUNKFOOD | FRUIT | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ custom_price = 90 + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/no_raisin/healthy name = "homemade raisins" @@ -99,6 +103,7 @@ junkiness = 25 filling_color = "#FFD700" foodtype = JUNKFOOD | GRAIN | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ custom_price = 30 /obj/item/reagent_containers/food/snacks/candy_trash @@ -114,6 +119,7 @@ /obj/item/reagent_containers/food/snacks/candy_trash/nicotine desc = "The leftover from a smoked-out candy cigarette. Smells like nicotine..?" list_reagents = list(/datum/reagent/consumable/sugar = 4, /datum/reagent/ash = 3, /datum/reagent/drug/nicotine = 1) + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/cheesiehonkers name = "cheesie honkers" @@ -136,6 +142,7 @@ filling_color = "#F5F5DC" tastes = list("sweetness" = 3, "cake" = 1) foodtype = GRAIN | FRUIT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL /obj/item/reagent_containers/food/snacks/energybar name = "High-power energy bars" @@ -146,3 +153,5 @@ filling_color = "#97ee63" tastes = list("pure electricity" = 3, "fitness" = 2) foodtype = TOXIC + /*food_flags = FOOD_FINGER_FOOD*/ + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index 4fa5354339c5..5433750b92a1 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -27,7 +27,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 5 layer = BELOW_OBJ_LAYER - var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW? + var/obj/item/food/deepfryholder/frying //What's being fried RIGHT NOW? var/cook_time = 0 var/oil_use = 0.05 //How much cooking oil is used per tick var/fry_speed = 1 //How quickly we fry food @@ -93,7 +93,7 @@ if(I.resistance_flags & INDESTRUCTIBLE) to_chat(user, "You don't feel it would be wise to fry [I]...") return - if(istype(I, /obj/item/reagent_containers/food/snacks/deepfryholder)) + if(istype(I, /obj/item/food/deepfryholder)) to_chat(user, "Your cooking skills are not up to the legendary Doublefry technique.") return if(default_unfasten_wrench(user, I)) @@ -105,7 +105,9 @@ return ..() else if(!frying && user.transferItemToLoc(I, src)) to_chat(user, "You put [I] into [src].") - frying = new/obj/item/reagent_containers/food/snacks/deepfryholder(src, I) + log_game("[key_name(user)] deep fried [I.name] ([I.type]) at [AREACOORD(src)].") + user.log_message("deep fried [I.name] ([I.type]) at [AREACOORD(src)].", LOG_GAME) + frying = new/obj/item/food/deepfryholder(src, I) icon_state = "fryer_on" fry_loop.start() diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 1d4e366ad6d9..9b8d00785afe 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -210,7 +210,7 @@ return /obj/item/reagent_containers/food/snacks/icecream - name = "ice cream cone" + name = "waffle cone" desc = "Delicious waffle cone, but no ice cream." icon = 'icons/obj/kitchen.dmi' icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time @@ -218,8 +218,9 @@ tastes = list("cream" = 2, "waffle" = 1) var/ice_creamed = 0 var/cone_type - bitesize = 4 + bitesize = 3 foodtype = DAIRY | SUGAR + /*food_flags = FOOD_FINGER_FOOD*/ /obj/item/reagent_containers/food/snacks/icecream/Initialize() . = ..() diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index 55db7cf06b84..3bad9cf0c265 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -35,7 +35,7 @@ /datum/food_processor_process/spaghetti input = /obj/item/reagent_containers/food/snacks/doughslice - output = /obj/item/reagent_containers/food/snacks/spaghetti + output = /obj/item/food/spaghetti/raw /datum/food_processor_process/corn input = /obj/item/reagent_containers/food/snacks/grown/corn diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index f29e948adf4c..d4dab76aa945 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -6,83 +6,83 @@ /datum/crafting_recipe/food/meatbread name = "Meat bread" reqs = list( - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/meat/cutlet/plain = 3, /obj/item/reagent_containers/food/snacks/cheesewedge = 3 ) - result = /obj/item/reagent_containers/food/snacks/store/bread/meat + result = /obj/item/food/bread/meat subcategory = CAT_BREAD /datum/crafting_recipe/food/xenomeatbread name = "Xenomeat bread" reqs = list( - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/meat/cutlet/xeno = 3, /obj/item/reagent_containers/food/snacks/cheesewedge = 3 ) - result = /obj/item/reagent_containers/food/snacks/store/bread/xenomeat + result = /obj/item/food/bread/xenomeat subcategory = CAT_BREAD /datum/crafting_recipe/food/spidermeatbread name = "Spidermeat bread" reqs = list( - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/meat/cutlet/spider = 3, /obj/item/reagent_containers/food/snacks/cheesewedge = 3 ) - result = /obj/item/reagent_containers/food/snacks/store/bread/spidermeat + result = /obj/item/food/bread/spidermeat subcategory = CAT_BREAD /datum/crafting_recipe/food/banananutbread name = "Banana nut bread" reqs = list( /datum/reagent/consumable/milk = 5, - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/boiledegg = 3, /obj/item/reagent_containers/food/snacks/grown/banana = 1 ) - result = /obj/item/reagent_containers/food/snacks/store/bread/banana + result = /obj/item/food/bread/banana subcategory = CAT_BREAD /datum/crafting_recipe/food/tofubread name = "Tofu bread" reqs = list( - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/tofu = 3, /obj/item/reagent_containers/food/snacks/cheesewedge = 3 ) - result = /obj/item/reagent_containers/food/snacks/store/bread/tofu + result = /obj/item/food/bread/tofu subcategory = CAT_BREAD /datum/crafting_recipe/food/creamcheesebread name = "Cream cheese bread" reqs = list( /datum/reagent/consumable/milk = 5, - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/cheesewedge = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/bread/creamcheese + result = /obj/item/food/bread/creamcheese subcategory = CAT_BREAD /datum/crafting_recipe/food/mimanabread name = "Mimana bread" reqs = list( /datum/reagent/consumable/soymilk = 5, - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/tofu = 3, /obj/item/reagent_containers/food/snacks/grown/banana/mime = 1 ) - result = /obj/item/reagent_containers/food/snacks/store/bread/mimana + result = /obj/item/food/bread/mimana subcategory = CAT_BREAD /datum/crafting_recipe/food/garlicbread name = "Garlic Bread" time = 40 reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 1, - /obj/item/reagent_containers/food/snacks/breadslice/plain = 1, + /obj/item/food/breadslice/plain = 1, /obj/item/reagent_containers/food/snacks/butter = 1 ) - result = /obj/item/reagent_containers/food/snacks/garlicbread + result = /obj/item/food/garlicbread subcategory = CAT_BREAD /datum/crafting_recipe/food/butterbiscuit @@ -91,7 +91,7 @@ /obj/item/reagent_containers/food/snacks/bun = 1, /obj/item/reagent_containers/food/snacks/butter = 1 ) - result = /obj/item/reagent_containers/food/snacks/butterbiscuit + result = /obj/item/food/butterbiscuit subcategory = CAT_BREAD /datum/crafting_recipe/food/butterdog @@ -100,14 +100,28 @@ /obj/item/reagent_containers/food/snacks/bun = 1, /obj/item/reagent_containers/food/snacks/butter = 3, ) - result = /obj/item/reagent_containers/food/snacks/butterdog + result = /obj/item/food/butterdog subcategory = CAT_BREAD /datum/crafting_recipe/food/moldybread // why would you make this? name = "Moldy Bread" reqs = list( - /obj/item/reagent_containers/food/snacks/breadslice/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/mushroom/amanita = 1 + /obj/item/food/bread/plain = 1, + /obj/item/organ/ears/cat = 1, + /obj/item/organ/tail/cat = 1, + /obj/item/reagent_containers/food/snacks/meat/slab = 3, + /datum/reagent/blood = 50, + /datum/reagent/medicine/strange_reagent = 5 ) - result = /obj/item/reagent_containers/food/snacks/breadslice/moldy + result = /mob/living/simple_animal/pet/cat/breadcat + subcategory = CAT_BREAD + +/datum/crafting_recipe/food/hotdog + name = "Hot dog" + reqs = list( + /datum/reagent/consumable/ketchup = 5, + /obj/item/reagent_containers/food/snacks/bun = 1, + /obj/item/reagent_containers/food/snacks/sausage = 1 + ) + result = /obj/item/reagent_containers/food/snacks/hotdog subcategory = CAT_BREAD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index dcae05095ae8..31ff03ba75bf 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -6,190 +6,190 @@ /datum/crafting_recipe/food/carrotcake name = "Carrot cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/carrot = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/carrot + result = /obj/item/food/cake/carrot subcategory = CAT_CAKE /datum/crafting_recipe/food/cheesecake name = "Cheese cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/cheesewedge = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/cheese + result = /obj/item/food/cake/cheese subcategory = CAT_CAKE /datum/crafting_recipe/food/applecake name = "Apple cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/apple = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/apple + result = /obj/item/food/cake/apple subcategory = CAT_CAKE /datum/crafting_recipe/food/orangecake name = "Orange cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/orange + result = /obj/item/food/cake/orange subcategory = CAT_CAKE /datum/crafting_recipe/food/limecake name = "Lime cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/citrus/lime = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/lime + result = /obj/item/food/cake/lime subcategory = CAT_CAKE /datum/crafting_recipe/food/lemoncake name = "Lemon cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/citrus/lemon = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/lemon + result = /obj/item/food/cake/lemon subcategory = CAT_CAKE /datum/crafting_recipe/food/chocolatecake name = "Chocolate cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/chocolatebar = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/chocolate + result = /obj/item/food/cake/chocolate subcategory = CAT_CAKE /datum/crafting_recipe/food/birthdaycake name = "Birthday cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/candle = 1, /datum/reagent/consumable/sugar = 5, /datum/reagent/consumable/caramel = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/birthday + result = /obj/item/food/cake/birthday subcategory = CAT_CAKE /datum/crafting_recipe/food/energycake name = "Energy cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/birthday = 1, + /obj/item/food/cake/birthday = 1, /obj/item/melee/transforming/energy/sword = 1, ) - blacklist = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday/energy) - result = /obj/item/reagent_containers/food/snacks/store/cake/birthday/energy + blacklist = list(/obj/item/food/cake/birthday/energy) + result = /obj/item/food/cake/birthday/energy subcategory = CAT_CAKE /datum/crafting_recipe/food/braincake name = "Brain cake" reqs = list( /obj/item/organ/brain = 1, - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1 + /obj/item/food/cake/plain = 1 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/brain + result = /obj/item/food/cake/brain subcategory = CAT_CAKE /datum/crafting_recipe/food/slimecake name = "Slime cake" reqs = list( /obj/item/slime_extract = 1, - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1 + /obj/item/food/cake/plain = 1 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/slimecake + result = /obj/item/food/cake/slimecake subcategory = CAT_CAKE /datum/crafting_recipe/food/pumpkinspicecake name = "Pumpkin spice cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/pumpkin = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/pumpkinspice + result = /obj/item/food/cake/pumpkinspice subcategory = CAT_CAKE /datum/crafting_recipe/food/holycake name = "Angel food cake" reqs = list( /datum/reagent/water/holywater = 15, - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1 + /obj/item/food/cake/plain = 1 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/holy_cake + result = /obj/item/food/cake/holy_cake subcategory = CAT_CAKE /datum/crafting_recipe/food/poundcake name = "Pound cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 4 + /obj/item/food/cake/plain = 4 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/pound_cake + result = /obj/item/food/cake/pound_cake subcategory = CAT_CAKE /datum/crafting_recipe/food/hardwarecake name = "Hardware cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/circuitboard = 2, /datum/reagent/toxin/acid = 5 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/hardware_cake + result = /obj/item/food/cake/hardware_cake subcategory = CAT_CAKE /datum/crafting_recipe/food/bscccake name = "blackberry and strawberry chocolate cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/chocolatebar = 2, /obj/item/reagent_containers/food/snacks/grown/berries = 5 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/bscc + result = /obj/item/food/cake/bscc subcategory = CAT_CAKE /datum/crafting_recipe/food/bscvcake name = "blackberry and strawberry vanilla cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/berries = 5 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/bsvc + result = /obj/item/food/cake/bsvc subcategory = CAT_CAKE /datum/crafting_recipe/food/clowncake name = "clown cake" always_availible = FALSE reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/sundae = 2, /obj/item/reagent_containers/food/snacks/grown/banana = 5 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/clown_cake + result = /obj/item/food/cake/clown_cake subcategory = CAT_CAKE /datum/crafting_recipe/food/vanillacake name = "vanilla cake" always_availible = FALSE reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /obj/item/reagent_containers/food/snacks/grown/vanillapod = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake + result = /obj/item/food/cake/vanilla_cake subcategory = CAT_CAKE /datum/crafting_recipe/food/trumpetcake name = "Spaceman's Cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/trumpet = 2, + /obj/item/food/cake/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/flower/trumpet = 2, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/berryjuice = 5 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/trumpet + result = /obj/item/food/cake/trumpet subcategory = CAT_CAKE @@ -198,7 +198,7 @@ reqs = list( /obj/item/organ/brain = 1, /obj/item/organ/heart = 1, - /obj/item/reagent_containers/food/snacks/store/cake/birthday = 1, + /obj/item/food/cake/birthday = 1, /obj/item/reagent_containers/food/snacks/meat/slab = 3, /datum/reagent/blood = 30, /datum/reagent/consumable/sprinkles = 5, @@ -206,3 +206,14 @@ ) result = /mob/living/simple_animal/pet/cat/cak subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Felines + +/datum/crafting_recipe/food/popup_cake + name = "Towering pile of cakes" + reqs = list( + /obj/item/food/cake/plain = 3, + /datum/reagent/consumable/sugar = 10, + /datum/reagent/consumable/cream = 5, + /obj/item/bikehorn/airhorn = 1 + ) + result = /obj/structure/popout_cake + subcategory = CAT_CAKE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm index 522f362e777e..a4ab818fdd6f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm @@ -36,7 +36,7 @@ reqs = list( /obj/item/reagent_containers/food/snacks/friedegg = 1, /obj/item/reagent_containers/food/snacks/meat/steak = 1, - /obj/item/reagent_containers/food/snacks/breadslice/plain = 1, + /obj/item/food/breadslice/plain = 1, ) result = /obj/item/reagent_containers/food/snacks/benedict subcategory = CAT_EGG diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 1bb3d250a9ae..b1191fda7ada 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -102,7 +102,7 @@ /datum/reagent/consumable/blackpepper = 1, /obj/item/reagent_containers/food/snacks/pastrybase = 2 ) - result = /obj/item/reagent_containers/food/snacks/baguette + result = /obj/item/food/baguette subcategory = CAT_MISCFOOD ////////////////////////////////////////////////TOAST//////////////////////////////////////////////// @@ -111,7 +111,7 @@ name = "Slime toast" reqs = list( /datum/reagent/toxin/slimejelly = 5, - /obj/item/reagent_containers/food/snacks/breadslice/plain = 1 + /obj/item/food/breadslice/plain = 1 ) result = /obj/item/reagent_containers/food/snacks/jelliedtoast/slime subcategory = CAT_MISCFOOD @@ -120,7 +120,7 @@ name = "Jellied toast" reqs = list( /datum/reagent/consumable/cherryjelly = 5, - /obj/item/reagent_containers/food/snacks/breadslice/plain = 1 + /obj/item/food/breadslice/plain = 1 ) result = /obj/item/reagent_containers/food/snacks/jelliedtoast/cherry subcategory = CAT_MISCFOOD @@ -128,7 +128,7 @@ /datum/crafting_recipe/food/butteredtoast name = "Buttered Toast" reqs = list( - /obj/item/reagent_containers/food/snacks/breadslice/plain = 1, + /obj/item/food/breadslice/plain = 1, /obj/item/reagent_containers/food/snacks/butter = 1 ) result = /obj/item/reagent_containers/food/snacks/butteredtoast @@ -138,7 +138,7 @@ name = "Two bread" reqs = list( /datum/reagent/consumable/ethanol/wine = 5, - /obj/item/reagent_containers/food/snacks/breadslice/plain = 2 + /obj/item/food/breadslice/plain = 2 ) result = /obj/item/reagent_containers/food/snacks/twobread subcategory = CAT_MISCFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index ec04dcaa4ec9..d982b6705bda 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -474,7 +474,7 @@ reqs = list( /datum/reagent/consumable/eggyolk = 5, /obj/item/reagent_containers/food/snacks/cheesewedge = 1, - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1 + /obj/item/food/bread/plain = 1 ) result = /obj/item/reagent_containers/food/snacks/khachapuri subcategory = CAT_PASTRY @@ -576,7 +576,7 @@ /obj/item/reagent_containers/food/snacks/pastrybase = 1, /obj/item/reagent_containers/food/snacks/grown/bluecherries = 1 ) - result = /obj/item/reagent_containers/food/snacks/bluecherrycupcake + result = /obj/item/reagent_containers/food/snacks/cherrycupcake/blue subcategory = CAT_PASTRY /datum/crafting_recipe/food/honeybun diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm index 41829e9ec2b8..022011d3bfc9 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm @@ -9,7 +9,7 @@ /datum/crafting_recipe/food/sandwich name = "Sandwich" reqs = list( - /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + /obj/item/food/breadslice/plain = 2, /obj/item/reagent_containers/food/snacks/meat/steak = 1, /obj/item/reagent_containers/food/snacks/cheesewedge = 1 ) @@ -19,7 +19,7 @@ /datum/crafting_recipe/food/grilledcheesesandwich name = "Cheese sandwich" reqs = list( - /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + /obj/item/food/breadslice/plain = 2, /obj/item/reagent_containers/food/snacks/cheesewedge = 2 ) result = /obj/item/reagent_containers/food/snacks/grilledcheese @@ -29,7 +29,7 @@ name = "Jelly sandwich" reqs = list( /datum/reagent/toxin/slimejelly = 5, - /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + /obj/item/food/breadslice/plain = 2, ) result = /obj/item/reagent_containers/food/snacks/jellysandwich/slime subcategory = CAT_SANDWICH @@ -38,7 +38,7 @@ name = "Jelly sandwich" reqs = list( /datum/reagent/consumable/cherryjelly = 5, - /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + /obj/item/food/breadslice/plain = 2, ) result = /obj/item/reagent_containers/food/snacks/jellysandwich/cherry subcategory = CAT_SANDWICH @@ -46,7 +46,7 @@ /datum/crafting_recipe/food/notasandwich name = "Not a sandwich" reqs = list( - /obj/item/reagent_containers/food/snacks/breadslice/plain = 2, + /obj/item/food/breadslice/plain = 2, /obj/item/clothing/mask/fakemoustache = 1 ) result = /obj/item/reagent_containers/food/snacks/notasandwich diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm index 796c360c3448..bd2186687d37 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm @@ -6,65 +6,108 @@ /datum/crafting_recipe/food/tomatopasta name = "Tomato pasta" reqs = list( - /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, /obj/item/reagent_containers/food/snacks/grown/tomato = 2 ) - result = /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato + result = /obj/item/food/spaghetti/pastatomato subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/copypasta name = "Copypasta" reqs = list( - /obj/item/reagent_containers/food/snacks/spaghetti/pastatomato = 2 + /obj/item/food/spaghetti/pastatomato = 2 ) - result = /obj/item/reagent_containers/food/snacks/spaghetti/copypasta + result = /obj/item/food/spaghetti/copypasta subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/spaghettimeatball name = "Spaghetti meatball" reqs = list( - /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, /obj/item/reagent_containers/food/snacks/meatball = 2 ) - result = /obj/item/reagent_containers/food/snacks/spaghetti/meatballspaghetti + result = /obj/item/food/spaghetti/meatballspaghetti subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/spesslaw name = "Spesslaw" reqs = list( - /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, /obj/item/reagent_containers/food/snacks/meatball = 4 ) - result = /obj/item/reagent_containers/food/snacks/spaghetti/spesslaw + result = /obj/item/food/spaghetti/spesslaw subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/beefnoodle name = "Beef noodle" reqs = list( /obj/item/reagent_containers/glass/bowl = 1, - /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, /obj/item/reagent_containers/food/snacks/meat/cutlet = 2, /obj/item/reagent_containers/food/snacks/grown/cabbage = 1 ) - result = /obj/item/reagent_containers/food/snacks/spaghetti/beefnoodle + result = /obj/item/food/spaghetti/beefnoodle subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/chowmein name = "Chowmein" reqs = list( - /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, /obj/item/reagent_containers/food/snacks/meat/cutlet = 1, /obj/item/reagent_containers/food/snacks/grown/cabbage = 2, /obj/item/reagent_containers/food/snacks/grown/carrot = 1 ) - result = /obj/item/reagent_containers/food/snacks/spaghetti/chowmein + result = /obj/item/food/spaghetti/chowmein subcategory = CAT_SPAGHETTI /datum/crafting_recipe/food/butternoodles name = "Butter Noodles" reqs = list( - /obj/item/reagent_containers/food/snacks/spaghetti/boiledspaghetti = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, /obj/item/reagent_containers/food/snacks/butter = 1 ) - result = /obj/item/reagent_containers/food/snacks/spaghetti/butternoodles + result = /obj/item/food/spaghetti/butternoodles + subcategory = CAT_SPAGHETTI + +/datum/crafting_recipe/food/kasespatzle + name = "Käsespätzle" + reqs = list( + /obj/item/food/spaghetti/boiledspaghetti = 1, + /datum/reagent/consumable/eggyolk = 10, + /obj/item/reagent_containers/food/snacks/cheesewedge = 1 + ) + result = /obj/item/food/spaghetti/kasespatzle + subcategory = CAT_SPAGHETTI + +/datum/crafting_recipe/food/spaghettinapolitan + name = "Spaghetti Napolitan" + reqs = list( + /obj/item/food/spaghetti/boiledspaghetti = 1, + /datum/reagent/consumable/ketchup = 10, + /obj/item/reagent_containers/food/snacks/sausage = 1, + /obj/item/reagent_containers/food/snacks/grown/chili = 1 + ) + result = /obj/item/food/spaghetti/spaghettinapolitan + subcategory = CAT_SPAGHETTI + +/datum/crafting_recipe/food/lasagna + name = "Lasagna" + reqs = list( + /obj/item/food/spaghetti = 1, + /obj/item/reagent_containers/food/snacks/meatball = 1, + /obj/item/reagent_containers/food/snacks/grown/tomato = 1, + /obj/item/reagent_containers/food/snacks/cheesewedge = 1 + ) + result = /obj/item/food/spaghetti/lasagna + subcategory = CAT_SPAGHETTI + +/datum/crafting_recipe/food/glassnoodles + name = "Glass Noodles" + reqs = list( + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/reagent_containers/food/snacks/grown/carrot = 1, + /obj/item/reagent_containers/food/snacks/tofu = 1, + /obj/item/stack/sheet/glass = 1 + ) + result = /obj/item/food/spaghetti/glassnoodles subcategory = CAT_SPAGHETTI diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 9d88d3107551..e698785fa5a0 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -174,34 +174,19 @@ /datum/crafting_recipe/food/hotcrossbun name = "Hot-Cross Bun" reqs = list( - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /datum/reagent/consumable/sugar = 1 ) result = /obj/item/reagent_containers/food/snacks/hotcrossbun subcategory = CAT_MISCFOOD - -/obj/item/reagent_containers/food/snacks/store/cake/brioche - name = "brioche cake" - desc = "A ring of sweet, glazed buns." - icon_state = "briochecake" - slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/brioche - slices_num = 6 - bonus_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/consumable/nutriment/vitamin = 2) - -/obj/item/reagent_containers/food/snacks/cakeslice/brioche - name = "brioche cake slice" - desc = "Delicious sweet-bread. Who needs anything else?" - icon_state = "briochecake_slice" - filling_color = "#FFD700" - /datum/crafting_recipe/food/briochecake name = "Brioche cake" reqs = list( - /obj/item/reagent_containers/food/snacks/store/cake/plain = 1, + /obj/item/food/cake/plain = 1, /datum/reagent/consumable/sugar = 2 ) - result = /obj/item/reagent_containers/food/snacks/store/cake/brioche + result = /obj/item/food/cake/brioche subcategory = CAT_MISCFOOD /obj/item/reagent_containers/food/snacks/scotchegg @@ -234,7 +219,7 @@ /datum/crafting_recipe/food/mammi name = "Mammi" reqs = list( - /obj/item/reagent_containers/food/snacks/store/bread/plain = 1, + /obj/item/food/bread/plain = 1, /obj/item/reagent_containers/food/snacks/chocolatebar = 1, /datum/reagent/consumable/milk = 5 ) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 1916a7c52adb..90fd719abd07 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -270,7 +270,7 @@ maxHealth = 50 gender = FEMALE harm_intent_damage = 10 - butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/reagent_containers/food/snacks/cakeslice/birthday = 3, \ + butcher_results = list(/obj/item/organ/brain = 1, /obj/item/organ/heart = 1, /obj/item/food/cakeslice/birthday = 3, \ /obj/item/reagent_containers/food/snacks/meat/slab = 2) response_harm_continuous = "takes a bite out of" response_harm_simple = "take a bite out of" @@ -308,3 +308,23 @@ if(L.a_intent == INTENT_HARM && L.reagents && !stat) L.reagents.add_reagent(/datum/reagent/consumable/nutriment, 0.4) L.reagents.add_reagent(/datum/reagent/consumable/nutriment/vitamin, 0.4) + +/mob/living/simple_animal/pet/cat/breadcat + name = "bread cat" + desc = "It's a cat... with a bread!" + gender = MALE + icon_state = "breadcat" + icon_living = "breadcat" + icon_dead = "breadcat_dead" + collar_type = null + held_state = "breadcat" + butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1, /obj/item/organ/tongue/cat = 1, /obj/item/food/breadslice/plain = 1) + +/mob/living/simple_animal/pet/cat/halal + name = "arabian cat" + desc = "It's a cat with Agal on his head." + gender = MALE + icon_state = "cathalal" + icon_living = "cathalal" + collar_type = null + held_state = "cathalal" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index e4e6bdd1d620..692f7831a07b 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -112,9 +112,10 @@ /datum/reagent/consumable/cooking_oil/expose_obj(obj/O, reac_volume) if(holder && holder.chem_temp >= fry_temperature) - if(isitem(O) && !istype(O, /obj/item/reagent_containers/food/snacks/deepfryholder)) + if(isitem(O) && !istype(O, /obj/item/food/deepfryholder)) + log_game("[O.name] ([O.type]) has been deep fried by a reaction with cooking oil reagent at [AREACOORD(O)].") O.loc.visible_message("[O] rapidly fries as it's splashed with hot oil! Somehow.") - var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location(), O) + var/obj/item/food/deepfryholder/F = new(O.drop_location(), O) F.fry(volume) F.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 97290d54213f..855f75fd0dc6 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -139,7 +139,7 @@ var/chosen = getbork() var/obj/B = new chosen(T) if(prob(5))//Fry it! - var/obj/item/reagent_containers/food/snacks/deepfryholder/fried + var/obj/item/food/deepfryholder/fried fried = new(T, B) fried.fry() // actually set the name and colour it B = fried diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 6682a9ba7943..76ee50e8d7d1 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -3,6 +3,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) volume = 50 + obj_flags = UNIQUE_RENAME reagent_flags = OPENCONTAINER | DUNKABLE spillable = TRUE resistance_flags = ACID_PROOF diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index 501ff548e08f..8e01ed935a3a 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -107,7 +107,7 @@ Charged extracts: effect_desc = "Creates a slime cake and some drinks." /obj/item/slimecross/charged/silver/do_effect(mob/user) - new /obj/item/reagent_containers/food/snacks/store/cake/slimecake(get_turf(user)) + new /obj/item/food/cake/slimecake(get_turf(user)) for(var/i in 1 to 10) var/drink_type = get_random_drink() new drink_type(get_turf(user)) diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 017356d9152a..9aee2ca10624 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -72,7 +72,7 @@ ignore += typesof(/obj/effect/pod_landingzone_effect) ignore += typesof(/obj/effect/pod_landingzone) //These want fried food to take on the shape of, we can't pass that in - ignore += typesof(/obj/item/reagent_containers/food/snacks/deepfryholder) + ignore += typesof(/obj/item/food/deepfryholder) //Can't pass in a thing to glow ignore += typesof(/obj/effect/abstract/eye_lighting) //It wants a lot more context then we have diff --git a/shiptest.dme b/shiptest.dme index bb107a1f00f2..9f03241da9cb 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -106,6 +106,7 @@ #include "code\__DEFINES\plumbing.dm" #include "code\__DEFINES\power.dm" #include "code\__DEFINES\preferences.dm" +#include "code\__DEFINES\processing.dm" #include "code\__DEFINES\procpath.dm" #include "code\__DEFINES\profile.dm" #include "code\__DEFINES\projectiles.dm" @@ -195,6 +196,7 @@ #include "code\__HELPERS\stat_tracking.dm" #include "code\__HELPERS\string_assoc_lists.dm" #include "code\__HELPERS\string_lists.dm" +#include "code\__HELPERS\stoplag.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" @@ -465,10 +467,7 @@ #include "code\datums\components\creamed.dm" #include "code\datums\components\deadchat_control.dm" #include "code\datums\components\dejavu.dm" -#include "code\datums\components\deployable.dm" -#include "code\datums\components\dooropendeathproc.dm" -#include "code\datums\components\earprotection.dm" -#include "code\datums\components\edible.dm" +#include "code\datums\components\drift.dm" #include "code\datums\components\edit_complainer.dm" #include "code\datums\components\embedded.dm" #include "code\datums\components\empprotection.dm" @@ -537,10 +536,8 @@ #include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" #include "code\datums\components\crafting\tailoring.dm" -#include "code\datums\components\fantasy\_fantasy.dm" -#include "code\datums\components\fantasy\affix.dm" -#include "code\datums\components\fantasy\prefixes.dm" -#include "code\datums\components\fantasy\suffixes.dm" +#include "code\datums\components\food\edible.dm" +#include "code\datums\components\food\food_storage.dm" #include "code\datums\components\plumbing\_plumbing.dm" #include "code\datums\components\plumbing\chemical_acclimator.dm" #include "code\datums\components\plumbing\filter.dm" @@ -643,6 +640,19 @@ #include "code\datums\elements\waddling.dm" #include "code\datums\elements\decals\_decals.dm" #include "code\datums\elements\decals\blood.dm" +#include "code\datums\elements\food\dunkable.dm" +#include "code\datums\elements\food\food_trash.dm" +#include "code\datums\elements\food\processable.dm" +#include "code\datums\enumeration\callback_enumerator.dm" +#include "code\datums\enumeration\enumeration_operations.dm" +#include "code\datums\enumeration\enumerator.dm" +#include "code\datums\enumeration\list_dereferencer_enumerator.dm" +#include "code\datums\enumeration\list_enumerator.dm" +#include "code\datums\enumeration\safe_enumerator.dm" +#include "code\datums\greyscale\_greyscale_config.dm" +#include "code\datums\greyscale\greyscale_configs.dm" +#include "code\datums\greyscale\json_reader.dm" +#include "code\datums\greyscale\layer.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" @@ -1222,6 +1232,11 @@ #include "code\game\objects\items\devices\radio\headset.dm" #include "code\game\objects\items\devices\radio\intercom.dm" #include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\food\_food.dm" +#include "code\game\objects\items\food\bread.dm" +#include "code\game\objects\items\food\cake.dm" +#include "code\game\objects\items\food\spaghetti.dm" +#include "code\game\objects\items\grenades\_grenade.dm" #include "code\game\objects\items\grenades\antigravity.dm" #include "code\game\objects\items\grenades\chem_grenade.dm" #include "code\game\objects\items\grenades\clusterbuster.dm" @@ -2138,9 +2153,7 @@ #include "code\modules\food_and_drinks\food\customizables.dm" #include "code\modules\food_and_drinks\food\ration.dm" #include "code\modules\food_and_drinks\food\snacks.dm" -#include "code\modules\food_and_drinks\food\snacks_bread.dm" #include "code\modules\food_and_drinks\food\snacks_burgers.dm" -#include "code\modules\food_and_drinks\food\snacks_cake.dm" #include "code\modules\food_and_drinks\food\snacks_egg.dm" #include "code\modules\food_and_drinks\food\snacks_frozen.dm" #include "code\modules\food_and_drinks\food\snacks_meat.dm" @@ -2151,7 +2164,6 @@ #include "code\modules\food_and_drinks\food\snacks_salad.dm" #include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm" #include "code\modules\food_and_drinks\food\snacks_soup.dm" -#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm" #include "code\modules\food_and_drinks\food\snacks_vend.dm" #include "code\modules\food_and_drinks\food\snacks\dough.dm" #include "code\modules\food_and_drinks\food\snacks\meat.dm"