Chefs can now kiss food they make to make it with love. (And a lot of cooking refactoring) (#70409)

About The Pull Request

    Adds a skillchip to the chef's vendor. This vendor allows the chef to kiss their food to deliver a chef's kiss.
        Chef's kissing your food will add the "love" reagent to the food, which makes people much happier when they eat it. Be careful, overdosing on love can cause heart attacks.

    Refactors microwaving.
        Separates microwaving out of the edible component and makes it its own element, like grillable and bakeable.
        Also removes some magic numbers from microwave code.

    Code improvements all around baking and grilling code.

    Refactors edible component inheritance.
        Inheriting the edible component is now a viable way to cleanly add food types, flags, and callbacks. This makes it much much easier to change the values of an edible item without adding hacky signals / procs / getcomponent.

Why It's Good For The Game

Emergent chef gameplay.
Being able to further enhance your food with mood buffs.
Better code.
Changelog

cl Melbert
add: Chefs can now make food with love. They can purchase a skillchip from their vendor which enhances their kiss emote. Using your kiss on food you create will add a special reagent to it which makes it nicer.
refactor: Separated Microwavable from the Edible component, refactored microwave act to accompany this
refactor: Refactored how grilled items are generated
refactor: Refactored how silver slime food items are generated
refactor: Refactored how edible items inherit new edible statuses
code: Removed some magic numbers from microwaves
code: General code improvements for grillable / bakeable / etc
/cl
This commit is contained in:
MrMelbert
2022-11-03 15:45:01 -05:00
committed by GitHub
parent 901c541c85
commit 1ac4a67c27
62 changed files with 784 additions and 544 deletions

View File

@@ -1,24 +1,58 @@
///called when an item is used as an ingredient: (atom/customized)
#define COMSIG_ITEM_USED_AS_INGREDIENT "item_used_as_ingredient"
///called when an edible ingredient is added: (datum/component/edible/ingredient)
#define COMSIG_EDIBLE_INGREDIENT_ADDED "edible_ingredient_added"
//Food
///from Edible component: (mob/living/eater, mob/feeder, bitecount, bitesize)
// Eating stuff
/// From datum/component/edible/proc/TakeBite: (mob/living/eater, mob/feeder, bitecount, bitesize)
#define COMSIG_FOOD_EATEN "food_eaten"
///from base of datum/component/edible/on_entered: (mob/crosser, bitecount)
/// From base of datum/component/edible/on_entered: (mob/crosser, bitecount)
#define COMSIG_FOOD_CROSSED "food_crossed"
///from base of Component/edible/On_Consume: (mob/living/eater, mob/living/feeder)
/// From base of Component/edible/On_Consume: (mob/living/eater, mob/living/feeder)
#define COMSIG_FOOD_CONSUMED "food_consumed"
/// called when an item is used as an ingredient: (atom/customized)
#define COMSIG_ITEM_USED_AS_INGREDIENT "item_used_as_ingredient"
/// called when an edible ingredient is added: (datum/component/edible/ingredient)
#define COMSIG_FOOD_INGREDIENT_ADDED "edible_ingredient_added"
///from base of Component/edible/on_silver_slime_reaction: (obj/item/source)
#define COMSIG_FOOD_SILVER_SPAWNED "food_silver_spawned"
// Deep frying foods
/// From obj/item/food/deepfryholder/Initialize
#define COMSIG_ITEM_FRIED "item_fried"
/// Return to not burn the item
#define COMSIG_FRYING_HANDLED (1<<0)
// Microwaving foods
///called on item when microwaved (): (obj/machinery/microwave/microwave, mob/microwaver)
#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act"
/// Return on success - that is, a microwaved item was produced
#define COMPONENT_MICROWAVE_SUCCESS (1<<0)
/// Returned on "failure" - an item was produced but it was the default fail recipe
#define COMPONENT_MICROWAVE_BAD_RECIPE (1<<1)
///called on item when created through microwaving (): (obj/machinery/microwave/M, cooking_efficiency)
#define COMSIG_ITEM_MICROWAVE_COOKED "microwave_cooked"
// Grilling foods (griddle, grill, and bonfire)
///Called when an object is placed onto a griddle
#define COMSIG_ITEM_GRILL_PLACED_ON "item_placed_on_griddle"
///Called when an object is grilled ontop of a griddle
#define COMSIG_ITEM_GRILL_PROCESS "item_griddled"
/// Return to not burn the item
#define COMPONENT_HANDLED_GRILLING (1<<0)
///Called when an object is turned into another item through grilling ontop of a griddle
#define COMSIG_ITEM_GRILLED "item_grill_completed"
// Baking foods (oven)
//Called when an object is inserted into an oven (atom/oven, mob/baker)
#define COMSIG_ITEM_OVEN_PLACED_IN "item_placed_in_oven"
//Called when an object is in an oven
#define COMSIG_ITEM_OVEN_PROCESS "item_baked"
/// Return to not burn the item
#define COMPONENT_HANDLED_BAKING (1<<0)
/// Return if the result of the baking was a good thing
#define COMPONENT_BAKING_GOOD_RESULT (1<<1)
/// Return if the result of the baking was a bad thing / failuire
#define COMPONENT_BAKING_BAD_RESULT (1<<2)
///Called when an object is turned into another item through baking in an oven
#define COMSIG_ITEM_BAKED "item_bake_completed"
//Drink
///from base of obj/item/reagent_containers/cup/attack(): (mob/M, mob/user)

View File

@@ -135,31 +135,13 @@
///from base of obj/item/hit_reaction(): (list/args)
#define COMSIG_ITEM_HIT_REACT "item_hit_react"
#define COMPONENT_HIT_REACTION_BLOCK (1<<0)
///called on item when microwaved (): (obj/machinery/microwave/M)
#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act"
#define COMPONENT_SUCCESFUL_MICROWAVE (1<<0)
///called on item when created through microwaving (): (obj/machinery/microwave/M, cooking_efficiency)
#define COMSIG_ITEM_MICROWAVE_COOKED "microwave_cooked"
///from base of item/sharpener/attackby(): (amount, max)
#define COMSIG_ITEM_SHARPEN_ACT "sharpen_act"
#define COMPONENT_BLOCK_SHARPEN_APPLIED (1<<0)
#define COMPONENT_BLOCK_SHARPEN_BLOCKED (1<<1)
#define COMPONENT_BLOCK_SHARPEN_ALREADY (1<<2)
#define COMPONENT_BLOCK_SHARPEN_MAXED (1<<3)
///Called when an object is grilled ontop of a griddle
#define COMSIG_ITEM_GRILLED "item_griddled"
#define COMPONENT_HANDLED_GRILLING (1<<0)
///Called when an object is turned into another item through grilling ontop of a griddle
#define COMSIG_GRILL_COMPLETED "item_grill_completed"
///Called when an object is meant to be grilled through a grill: (atom/fry_object, grill_time)
#define COMSIG_GRILL_FOOD "item_grill_food"
//Called when an object is in an oven
#define COMSIG_ITEM_BAKED "item_baked"
#define COMPONENT_HANDLED_BAKING (1<<0)
#define COMPONENT_BAKING_GOOD_RESULT (1<<1)
#define COMPONENT_BAKING_BAD_RESULT (1<<2)
///Called when an object is turned into another item through baking in an oven
#define COMSIG_BAKE_COMPLETED "item_bake_completed"
///Called when an armor plate is successfully applied to an object
#define COMSIG_ARMOR_PLATED "armor_plated"
///Called when an item gets recharged by the ammo powerup

View File

@@ -19,6 +19,29 @@
#define BUGS (1<<18)
#define GORE (1<<19)
DEFINE_BITFIELD(foodtypes, list(
"MEAT" = MEAT,
"VEGETABLES" = VEGETABLES,
"RAW" = RAW,
"JUNKFOOD" = JUNKFOOD,
"GRAIN" = GRAIN,
"FRUIT" = FRUIT,
"DAIRY" = DAIRY,
"FRIED" = FRIED,
"ALCOHOL" = ALCOHOL,
"SUGAR" = SUGAR,
"GROSS" = GROSS,
"TOXIC" = TOXIC,
"PINEAPPLE" = PINEAPPLE,
"BREAKFAST" = BREAKFAST,
"CLOTH" = CLOTH,
"NUTS" = NUTS,
"SEAFOOD" = SEAFOOD,
"ORANGES" = ORANGES,
"BUGS" = BUGS,
"GORE" = GORE,
))
/// A list of food type names, in order of their flags
#define FOOD_FLAGS list( \
"MEAT", \
@@ -73,14 +96,18 @@
#define DRINK_FANTASTIC 4
#define FOOD_AMAZING 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)
///Is this food item spawned from a silver slime? Prevent it from exporting for profit from cargo and make it taste disgusting
#define FOOD_SILVER_SPAWNED (1<<2)
DEFINE_BITFIELD(food_types, list(
"FOOD_FINGER_FOOD" = FOOD_FINGER_FOOD,
"FOOD_IN_CONTAINER" = FOOD_IN_CONTAINER,
))
#define STOP_SERVING_BREAKFAST (15 MINUTES)
#define FOOD_MEAT_NORMAL 5
#define FOOD_MEAT_HUMAN 50
#define FOOD_MEAT_MUTANT 100

View File

@@ -474,6 +474,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_ENTRAILS_READER "entrails_reader"
/// this skillchip trait lets you wash brains in washing machines to heal them
#define TRAIT_BRAINWASHING "brainwashing"
/// Allows chef's to chefs kiss their food, to make them with love
#define TRAIT_CHEF_KISS "chefs_kiss"
///Movement type traits for movables. See elements/movetype_handler.dm
#define TRAIT_MOVE_GROUND "move_ground"
@@ -539,7 +541,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NO_STORAGE_INSERT "no_storage_insert"
/// Visible on t-ray scanners if the atom/var/level == 1
#define TRAIT_T_RAY_VISIBLE "t-ray-visible"
/// If this item's been grilled
#define TRAIT_FOOD_GRILLED "food_grilled"
/// This is a silver slime created item
#define TRAIT_FOOD_SILVER "food_silver"
/// If this item's been made by a chef instead of being map-spawned or admin-spawned or such
#define TRAIT_FOOD_CHEF_MADE "food_made_by_chef"
/// The items needs two hands to be carried
#define TRAIT_NEEDS_TWO_HANDS "needstwohands"
/// Can't be catched when thrown

View File

@@ -11,6 +11,8 @@
///Time spent baking so far
var/current_bake_time = 0
/// REF() to the mob which placed us in an oven
var/who_baked_us
/datum/component/bakeable/Initialize(bake_result, required_bake_time, positive_result, use_large_steam_sprite)
. = ..()
@@ -33,32 +35,42 @@
src.positive_result = positive_result
/datum/component/bakeable/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_BAKED, .proc/OnBake)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/OnExamine)
RegisterSignal(parent, COMSIG_ITEM_OVEN_PLACED_IN, .proc/on_baking_start)
RegisterSignal(parent, COMSIG_ITEM_OVEN_PROCESS, .proc/on_bake)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
/datum/component/bakeable/UnregisterFromParent()
. = ..()
UnregisterSignal(parent, list(COMSIG_ITEM_BAKED, COMSIG_PARENT_EXAMINE))
UnregisterSignal(parent, list(COMSIG_ITEM_OVEN_PLACED_IN, COMSIG_ITEM_OVEN_PROCESS, COMSIG_PARENT_EXAMINE))
///Ran every time an item is baked by something
/datum/component/bakeable/proc/OnBake(datum/source, atom/used_oven, delta_time = 1)
/// Signal proc for [COMSIG_ITEM_OVEN_PLACED_IN] when baking starts (parent enters an oven)
/datum/component/bakeable/proc/on_baking_start(datum/source, atom/used_oven, mob/baker)
SIGNAL_HANDLER
. = COMPONENT_HANDLED_BAKING
if(baker)
who_baked_us = REF(baker)
. |= positive_result ? COMPONENT_BAKING_GOOD_RESULT : COMPONENT_BAKING_BAD_RESULT //Are we baking shit or great food?
///Ran every time an item is baked by something
/datum/component/bakeable/proc/on_bake(datum/source, atom/used_oven, delta_time = 1)
SIGNAL_HANDLER
// Let our signal know if we're baking something good or ... burning something
var/baking_result = positive_result ? COMPONENT_BAKING_GOOD_RESULT : COMPONENT_BAKING_BAD_RESULT
current_bake_time += delta_time * 10 //turn it into ds
if(current_bake_time >= required_bake_time)
FinishBaking(used_oven)
finish_baking(used_oven)
return COMPONENT_HANDLED_BAKING | baking_result
///Ran when an object finished baking
/datum/component/bakeable/proc/FinishBaking(atom/used_oven)
/datum/component/bakeable/proc/finish_baking(atom/used_oven)
var/atom/original_object = parent
var/obj/item/plate/oven_tray/used_tray = original_object.loc
var/atom/baked_result = new bake_result(used_tray)
if(who_baked_us)
ADD_TRAIT(baked_result, TRAIT_FOOD_CHEF_MADE, who_baked_us)
if(original_object.custom_materials)
baked_result.set_custom_materials(original_object.custom_materials, 1)
@@ -71,11 +83,11 @@
used_oven.visible_message(span_notice("You smell something great coming from [used_oven]."), blind_message = span_notice("You smell something great..."))
else
used_oven.visible_message(span_warning("You smell a burnt smell coming from [used_oven]."), blind_message = span_warning("You smell a burnt smell..."))
SEND_SIGNAL(parent, COMSIG_BAKE_COMPLETED, baked_result)
SEND_SIGNAL(parent, COMSIG_ITEM_BAKED, baked_result)
qdel(parent)
///Gives info about the items baking status so you can see if its almost done
/datum/component/bakeable/proc/OnExamine(atom/A, mob/user, list/examine_list)
/datum/component/bakeable/proc/on_examine(atom/source, mob/user, list/examine_list)
SIGNAL_HANDLER
if(!current_bake_time) //Not baked yet

View File

@@ -36,15 +36,10 @@ Behavior that's still missing from this component that original food items had t
var/datum/callback/check_liked
///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
var/volume = 50
///The flavortext for taste (haha get it flavor text)
var/list/tastes
///The type of atom this creates when the object is microwaved.
var/atom/microwaved_type
/datum/component/edible/Initialize(
list/initial_reagents,
@@ -53,9 +48,8 @@ Behavior that's still missing from this component that original food items had t
volume = 50,
eat_time = 10,
list/tastes,
list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
list/eatverbs = list("bite", "chew", "nibble", "gnaw", "gobble", "chomp"),
bite_consumption = 2,
microwaved_type,
junkiness,
datum/callback/after_eat,
datum/callback/on_consume,
@@ -64,109 +58,177 @@ Behavior that's still missing from this component that original food items had t
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, .proc/UseByAnimal)
RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, .proc/OnCraft)
RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, .proc/OnProcessed)
RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_COOKED, .proc/OnMicrowaveCooked)
RegisterSignal(parent, COMSIG_EDIBLE_INGREDIENT_ADDED, .proc/edible_ingredient_added)
RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, .proc/on_ooze_eat)
if(!isturf(parent))
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = .proc/on_entered,
)
AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections)
else
RegisterSignal(parent, COMSIG_ATOM_ENTERED, .proc/on_entered)
if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/UseFromHand)
RegisterSignal(parent, COMSIG_ITEM_FRIED, .proc/OnFried)
RegisterSignal(parent, COMSIG_GRILL_FOOD, .proc/GrillFood)
RegisterSignal(parent, COMSIG_ITEM_MICROWAVE_ACT, .proc/OnMicrowaved)
RegisterSignal(parent, COMSIG_FOOD_SILVER_SPAWNED, .proc/on_silver_slime_reaction)
RegisterSignal(parent, COMSIG_ITEM_USED_AS_INGREDIENT, .proc/used_to_customize)
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.
else if(isturf(parent) || isstructure(parent))
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/TryToEatIt)
src.bite_consumption = bite_consumption
src.food_flags = food_flags
src.foodtypes = foodtypes
src.volume = volume
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
src.check_liked = check_liked
var/atom/owner = parent
setup_initial_reagents(initial_reagents)
owner.create_reagents(volume, INJECTABLE)
/datum/component/edible/RegisterWithParent()
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, .proc/UseByAnimal)
RegisterSignal(parent, COMSIG_ATOM_CHECKPARTS, .proc/OnCraft)
RegisterSignal(parent, COMSIG_ATOM_CREATEDBY_PROCESSING, .proc/OnProcessed)
RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, .proc/edible_ingredient_added)
RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, .proc/on_ooze_eat)
for(var/rid in initial_reagents)
var/amount = initial_reagents[rid]
if(length(tastes) && (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)
if(isturf(parent))
RegisterSignal(parent, COMSIG_ATOM_ENTERED, .proc/on_entered)
else
var/static/list/loc_connections = list(COMSIG_ATOM_ENTERED = .proc/on_entered)
AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections)
if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/UseFromHand)
RegisterSignal(parent, COMSIG_ITEM_FRIED, .proc/OnFried)
RegisterSignal(parent, COMSIG_ITEM_USED_AS_INGREDIENT, .proc/used_to_customize)
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.
else if(isturf(parent) || isstructure(parent))
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/TryToEatIt)
/datum/component/edible/UnregisterFromParent()
UnregisterSignal(parent, list(
COMSIG_ATOM_ATTACK_ANIMAL,
COMSIG_ATOM_ATTACK_HAND,
COMSIG_ATOM_CHECKPARTS,
COMSIG_ATOM_CREATEDBY_PROCESSING,
COMSIG_ATOM_ENTERED,
COMSIG_FOOD_INGREDIENT_ADDED,
COMSIG_ITEM_ATTACK,
COMSIG_ITEM_FRIED,
COMSIG_ITEM_USED_AS_INGREDIENT,
COMSIG_OOZE_EAT_ATOM,
COMSIG_PARENT_EXAMINE,
))
qdel(GetComponent(/datum/component/connect_loc_behalf))
/datum/component/edible/InheritComponent(
datum/component/C,
datum/component/edible/old_comp,
i_am_original,
list/initial_reagents,
food_flags = NONE,
foodtypes = NONE,
volume = 50,
eat_time = 10,
volume,
eat_time,
list/tastes,
list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"),
bite_consumption = 2,
microwaved_type,
list/eatverbs,
bite_consumption,
junkiness,
datum/callback/after_eat,
datum/callback/on_consume,
datum/callback/check_liked,
)
. = ..()
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
src.on_consume = on_consume
// If we got passed an old comp, take only the values that will not override our current ones
if(old_comp)
food_flags = old_comp.food_flags
foodtypes = old_comp.foodtypes
tastes = old_comp.tastes
eatverbs = old_comp.eatverbs
// only edit if we're OG
if(!i_am_original)
return
// add food flags and types
src.food_flags |= food_flags
src.foodtypes |= foodtypes
// add all new eatverbs to the list
if(islist(eatverbs))
var/list/cached_verbs = src.eatverbs
if(islist(cached_verbs))
// eatverbs becomes a combination of existing verbs and new ones
src.eatverbs = string_list(cached_verbs | eatverbs)
else
src.eatverbs = string_list(eatverbs)
// add all new tastes to the tastes
if(islist(tastes))
var/list/cached_tastes = src.tastes
if(islist(cached_tastes))
// tastes becomes a combination of existing tastes and new ones
var/list/mixed_tastes = cached_tastes.Copy()
for(var/new_taste in tastes)
mixed_tastes[new_taste] += tastes[new_taste]
src.tastes = string_assoc_list(mixed_tastes)
else
src.tastes = string_assoc_list(tastes)
// just set these directly
if(!isnull(bite_consumption))
src.bite_consumption = bite_consumption
if(!isnull(volume))
src.volume = volume
if(!isnull(eat_time))
src.eat_time = eat_time
if(!isnull(junkiness))
src.junkiness = junkiness
if(!isnull(after_eat))
src.after_eat = after_eat
if(!isnull(on_consume))
src.on_consume = on_consume
if(!isnull(check_liked))
src.check_liked = check_liked
// add newly passed in reagents
setup_initial_reagents(initial_reagents)
/datum/component/edible/Destroy(force, silent)
QDEL_NULL(after_eat)
QDEL_NULL(on_consume)
QDEL_NULL(check_liked)
return ..()
/// Sets up the initial reagents of the food.
/datum/component/edible/proc/setup_initial_reagents(list/reagents)
var/atom/owner = parent
if(owner.reagents)
owner.reagents.maximum_volume = volume
else
owner.create_reagents(volume, INJECTABLE)
for(var/rid in reagents)
var/amount = reagents[rid]
if(length(tastes) && (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(microwaved_type)
examine_list += "[parent] could be <b>microwaved</b> into [initial(microwaved_type.name)]!"
if(foodtypes)
var/list/types = bitfield_to_list(foodtypes, FOOD_FLAGS)
examine_list += span_notice("It is [lowertext(english_list(types))].")
if(HAS_TRAIT_FROM(parent, TRAIT_FOOD_CHEF_MADE, REF(user)))
examine_list += span_green("[parent] was made by you!")
if(!(food_flags & FOOD_IN_CONTAINER))
switch (bitecount)
if (0)
return
switch(bitecount)
if(0)
// pass
if(1)
examine_list += "[parent] was bitten by someone!"
if(2,3)
examine_list += "[parent] was bitten [bitecount] times!"
examine_list += span_notice("[parent] was bitten by someone!")
if(2, 3)
examine_list += span_notice("[parent] was bitten [bitecount] times!")
else
examine_list += "[parent] was bitten multiple times!"
examine_list += span_notice("[parent] was bitten multiple times!")
/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user)
SIGNAL_HANDLER
@@ -186,29 +248,6 @@ Behavior that's still missing from this component that original food items had t
qdel(our_atom)
return COMSIG_FRYING_HANDLED
/datum/component/edible/proc/GrillFood(datum/source, atom/fry_object, grill_time)
SIGNAL_HANDLER
var/atom/this_food = parent
switch(grill_time) //no 0-20 to prevent spam
if(20 to 30)
this_food.name = "lightly-grilled [this_food.name]"
this_food.desc = "[this_food.desc] It's been lightly grilled."
if(30 to 80)
this_food.name = "grilled [this_food.name]"
this_food.desc = "[this_food.desc] It's been grilled."
foodtypes |= FRIED
if(80 to 100)
this_food.name = "heavily grilled [this_food.name]"
this_food.desc = "[this_food.desc] It's been heavily grilled."
foodtypes |= FRIED
if(100 to INFINITY) //grill marks reach max alpha
this_food.name = "Powerfully Grilled [this_food.name]"
this_food.desc = "A [this_food.name]. Reminds you of your wife, wait, no, it's prettier!"
foodtypes |= FRIED
///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/OnProcessed(datum/source, atom/original_atom, list/chosen_processing_option)
SIGNAL_HANDLER
@@ -249,38 +288,6 @@ Behavior that's still missing from this component that original food items had t
SSblackbox.record_feedback("tally", "food_made", 1, type)
/datum/component/edible/proc/OnMicrowaved(datum/source, obj/machinery/microwave/used_microwave)
SIGNAL_HANDLER
var/turf/parent_turf = get_turf(parent)
if(!microwaved_type)
new /obj/item/food/badrecipe(parent_turf)
qdel(parent)
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)
qdel(parent)
return COMPONENT_SUCCESFUL_MICROWAVE
///Corrects the reagents on the newly cooked food
/datum/component/edible/proc/OnMicrowaveCooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
SIGNAL_HANDLER
var/atom/this_food = parent
this_food.reagents.multiply_reagents(cooking_efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER)
source_item.reagents?.trans_to(this_food, source_item.reagents.total_volume)
///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)))
@@ -427,9 +434,9 @@ Behavior that's still missing from this component that original food items had t
var/fraction = min(bite_consumption / owner.reagents.total_volume, 1)
owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, methods = INGEST)
bitecount++
checkLiked(fraction, eater)
if(!owner.reagents.total_volume)
On_Consume(eater, feeder)
checkLiked(fraction, eater)
//Invoke our after eat callback if it is valid
if(after_eat)
@@ -487,7 +494,7 @@ Behavior that's still missing from this component that original food items had t
else if(foodtypes & H.dna.species.liked_food)
food_taste_reaction = FOOD_LIKED
if(food_flags & FOOD_SILVER_SPAWNED) // it's not real food
if(HAS_TRAIT(parent, TRAIT_FOOD_SILVER)) // it's not real food
food_taste_reaction = isjellyperson(H) ? FOOD_LIKED : FOOD_TOXIC
switch(food_taste_reaction)
@@ -552,23 +559,13 @@ Behavior that's still missing from this component that original food items had t
/datum/component/edible/proc/used_to_customize(datum/source, atom/customized)
SIGNAL_HANDLER
SEND_SIGNAL(customized, COMSIG_EDIBLE_INGREDIENT_ADDED, src)
///Adds this flag to the item to make it taste disgusting
/datum/component/edible/proc/on_silver_slime_reaction(obj/item/source)
SIGNAL_HANDLER
food_flags |= FOOD_SILVER_SPAWNED
SEND_SIGNAL(customized, COMSIG_FOOD_INGREDIENT_ADDED, src)
///Response to an edible ingredient being added to parent.
/datum/component/edible/proc/edible_ingredient_added(datum/source, datum/component/edible/ingredient)
SIGNAL_HANDLER
var/datum/component/edible/E = ingredient
if (LAZYLEN(E.tastes))
tastes = tastes.Copy()
for (var/t in E.tastes)
tastes[t] += E.tastes[t]
foodtypes |= E.foodtypes
InheritComponent(ingredient, TRUE)
/// Response to oozes trying to eat something edible
/datum/component/edible/proc/on_ooze_eat(datum/source, mob/eater, edible_flags)

View File

@@ -6,15 +6,12 @@
var/required_cook_time = 2 MINUTES
///Is this a positive grill result?
var/positive_result = TRUE
///Time spent cooking so far
var/current_cook_time = 0
///Are we currently grilling?
var/currently_grilling = FALSE
///Do we use the large steam sprite?
var/use_large_steam_sprite = FALSE
/// REF() to the mob which placed us on the griddle
var/who_placed_us
/datum/component/grillable/Initialize(cook_result, required_cook_time, positive_result, use_large_steam_sprite)
. = ..()
@@ -26,8 +23,13 @@
src.positive_result = positive_result
src.use_large_steam_sprite = use_large_steam_sprite
RegisterSignal(parent, COMSIG_ITEM_GRILLED, .proc/OnGrill)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/OnExamine)
/datum/component/grillable/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_GRILL_PLACED_ON, .proc/on_grill_start)
RegisterSignal(parent, COMSIG_ITEM_GRILL_PROCESS, .proc/on_grill)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
/datum/component/grillable/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_ITEM_GRILL_PLACED_ON, COMSIG_ITEM_GRILL_PROCESS, COMSIG_PARENT_EXAMINE))
// Inherit the new values passed to the component
/datum/component/grillable/InheritComponent(datum/component/grillable/new_comp, original, cook_result, required_cook_time, positive_result, use_large_steam_sprite)
@@ -42,60 +44,55 @@
if(use_large_steam_sprite)
src.use_large_steam_sprite = use_large_steam_sprite
/// Signal proc for [COMSIG_ITEM_GRILL_PLACED_ON], starts the grilling process.
/datum/component/grillable/proc/on_grill_start(datum/source, mob/griller)
SIGNAL_HANDLER
if(griller)
who_placed_us = REF(griller)
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_moved)
RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/add_grilled_item_overlay)
var/atom/atom_parent = parent
atom_parent.update_appearance()
///Ran every time an item is grilled by something
/datum/component/grillable/proc/OnGrill(datum/source, atom/used_grill, delta_time = 1)
/datum/component/grillable/proc/on_grill(datum/source, atom/used_grill, delta_time = 1)
SIGNAL_HANDLER
. = COMPONENT_HANDLED_GRILLING
current_cook_time += delta_time * 10 //turn it into ds
if(current_cook_time >= required_cook_time)
FinishGrilling(used_grill)
else if(!currently_grilling) //We havn't started grilling yet
StartGrilling(used_grill)
///Ran when an object starts grilling on something
/datum/component/grillable/proc/StartGrilling(atom/grill_source)
currently_grilling = TRUE
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/OnMoved)
RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/AddGrilledItemOverlay)
var/atom/A = parent
A.update_appearance()
finish_grilling(used_grill)
///Ran when an object finished grilling
/datum/component/grillable/proc/FinishGrilling(atom/grill_source)
/datum/component/grillable/proc/finish_grilling(atom/grill_source)
var/atom/original_object = parent
var/atom/grilled_result
if(isstack(parent)) //Check if its a sheet, for grilling multiple things in a stack
var/obj/item/stack/itemstack = original_object
var/atom/grilled_result = new cook_result(original_object.loc, itemstack.amount)
SEND_SIGNAL(parent, COMSIG_GRILL_COMPLETED, grilled_result)
currently_grilling = FALSE
grill_source.visible_message("<span class='[positive_result ? "notice" : "warning"]'>[parent] turns into \a [grilled_result]!</span>")
grilled_result.pixel_x = original_object.pixel_x
grilled_result.pixel_y = original_object.pixel_y
qdel(parent)
return
var/obj/item/stack/stack_parent = original_object
grilled_result = new cook_result(original_object.loc, stack_parent.amount)
var/atom/grilled_result = new cook_result(original_object.loc)
if(original_object.custom_materials)
grilled_result.set_custom_materials(original_object.custom_materials, 1)
grilled_result.pixel_x = original_object.pixel_x
grilled_result.pixel_y = original_object.pixel_y
else
grilled_result = new cook_result(original_object.loc)
if(original_object.custom_materials)
grilled_result.set_custom_materials(original_object.custom_materials)
SEND_SIGNAL(parent, COMSIG_ITEM_GRILLED, grilled_result)
if(who_placed_us)
ADD_TRAIT(grilled_result, TRAIT_FOOD_CHEF_MADE, who_placed_us)
grill_source.visible_message("<span class='[positive_result ? "notice" : "warning"]'>[parent] turns into \a [grilled_result]!</span>")
SEND_SIGNAL(parent, COMSIG_GRILL_COMPLETED, grilled_result)
currently_grilling = FALSE
grilled_result.pixel_x = original_object.pixel_x
grilled_result.pixel_y = original_object.pixel_y
qdel(parent)
///Ran when an object almost finishes grilling
/datum/component/grillable/proc/OnExamine(atom/A, mob/user, list/examine_list)
/datum/component/grillable/proc/on_examine(atom/A, mob/user, list/examine_list)
SIGNAL_HANDLER
if(!current_cook_time) //Not grilled yet
@@ -112,14 +109,14 @@
examine_list += span_danger("[parent] should probably not be cooked for much longer!")
///Ran when an object moves from the grill
/datum/component/grillable/proc/OnMoved(atom/A, atom/OldLoc, Dir, Forced)
/datum/component/grillable/proc/on_moved(atom/source, atom/OldLoc, Dir, Forced)
SIGNAL_HANDLER
currently_grilling = FALSE
UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS)
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
A.update_appearance()
source.update_appearance()
/datum/component/grillable/proc/AddGrilledItemOverlay(datum/source, list/overlays)
/datum/component/grillable/proc/add_grilled_item_overlay(datum/source, list/overlays)
SIGNAL_HANDLER
overlays += mutable_appearance('icons/effects/steam.dmi', "[use_large_steam_sprite ? "steam_triple" : "steam_single"]", ABOVE_OBJ_LAYER)

View File

@@ -0,0 +1,31 @@
/// Items grilled through the grill.
/datum/element/grilled_item
/datum/element/grilled_item/Attach(datum/target, grill_time)
. = ..()
if(!isatom(target))
return ELEMENT_INCOMPATIBLE
var/atom/this_food = target
switch(grill_time) //no 0-20 to prevent spam
if(20 to 30)
this_food.name = "lightly-grilled [this_food.name]"
this_food.desc += " It's been lightly grilled."
if(30 to 80)
this_food.name = "grilled [this_food.name]"
this_food.desc += " It's been grilled."
if(80 to 100)
this_food.name = "heavily grilled [this_food.name]"
this_food.desc += " It's been heavily grilled."
if(100 to INFINITY) //grill marks reach max alpha
this_food.name = "Powerfully Grilled [this_food.name]"
this_food.desc = "A [this_food.name]. Reminds you of your wife, wait, no, it's prettier!"
if(grill_time > 20)
ADD_TRAIT(this_food, TRAIT_FOOD_GRILLED, "boomers")
if(grill_time > 30)
this_food.AddComponent(/datum/component/edible, foodtypes = FRIED)

View File

@@ -0,0 +1,69 @@
/// Atoms that can be microwaved from one type to another.
/datum/element/microwavable
element_flags = ELEMENT_BESPOKE
id_arg_index = 2
/// The typepath we default to if we were passed no microwave result
var/atom/default_typepath = /obj/item/food/badrecipe
/// Resulting atom typepath on a completed microwave.
var/atom/result_typepath
/datum/element/microwavable/Attach(datum/target, microwave_type)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE
result_typepath = microwave_type || default_typepath
RegisterSignal(target, COMSIG_ITEM_MICROWAVE_ACT, .proc/on_microwaved)
if(!ispath(result_typepath, default_typepath))
RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine)
/datum/element/microwavable/Detach(datum/source)
UnregisterSignal(source, list(COMSIG_ITEM_MICROWAVE_ACT, COMSIG_PARENT_EXAMINE))
return ..()
/**
* Signal proc for [COMSIG_ITEM_MICROWAVE_ACT].
* Handles the actual microwaving part.
*/
/datum/element/microwavable/proc/on_microwaved(atom/source, obj/machinery/microwave/used_microwave, mob/microwaver)
SIGNAL_HANDLER
var/atom/result
var/turf/result_loc = get_turf(used_microwave || source)
if(isstack(source))
var/obj/item/stack/stack_source = source
result = new result_typepath(result_loc, stack_source.amount)
else
result = new result_typepath(result_loc)
var/efficiency = istype(used_microwave) ? used_microwave.efficiency : 1
SEND_SIGNAL(result, COMSIG_ITEM_MICROWAVE_COOKED, source, efficiency)
if(IS_EDIBLE(result))
if(microwaver)
ADD_TRAIT(result, TRAIT_FOOD_CHEF_MADE, REF(microwaver))
result.reagents?.multiply_reagents(efficiency * CRAFTED_FOOD_BASE_REAGENT_MODIFIER)
source.reagents?.trans_to(result, source.reagents.total_volume)
SSblackbox.record_feedback("tally", "food_made", 1, result.type)
qdel(source)
var/recipe_result = COMPONENT_MICROWAVE_SUCCESS
if(istype(result, default_typepath))
recipe_result |= COMPONENT_MICROWAVE_BAD_RECIPE
return recipe_result
/**
* Signal proc for [COMSIG_PARENT_EXAMINE].
* Lets examiners know we can be microwaved if we're not the default mess type
*/
/datum/element/microwavable/proc/on_examine(atom/source, mob/user, list/examine_list)
SIGNAL_HANDLER
examine_list += span_notice("[source] could be <b>microwaved</b> into \a [initial(result_typepath.name)].")

View File

@@ -30,7 +30,11 @@
/datum/material/meat/proc/make_edible(atom/source, amount, material_flags)
var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT)
var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT)
source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, RAW | MEAT | GROSS, null, 30, list("Fleshy"))
source.AddComponent(/datum/component/edible, \
initial_reagents = list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), \
foodtypes = RAW | MEAT | GROSS, \
eat_time = 3 SECONDS, \
tastes = list("Fleshy"))
/datum/material/meat/mob_meat

View File

@@ -28,4 +28,8 @@
/datum/material/pizza/proc/make_edible(atom/source, amount, material_flags)
var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT)
var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT)
source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat"))
source.AddComponent(/datum/component/edible, \
initial_reagents = list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), \
foodtypes = GRAIN | MEAT | DAIRY | VEGETABLES, \
eat_time = 3 SECONDS, \
tastes = list("crust", "tomato", "cheese", "meat"))

View File

@@ -278,6 +278,14 @@
mood_change = 10
timeout = 5 MINUTES
/datum/mood_event/love_reagent
description = "This food reminds me of the good ol' days."
mood_change = 5
/datum/mood_event/love_reagent/add_effects(duration)
if(isnum(duration))
timeout = duration
/datum/mood_event/won_52_card_pickup
description = "HA! That loser will be picking cards up for a long time!"
mood_change = 3

View File

@@ -1500,7 +1500,6 @@
if(i > 1)
created_atom.pixel_x += rand(-8,8)
created_atom.pixel_y += rand(-8,8)
SEND_SIGNAL(created_atom, COMSIG_ATOM_CREATEDBY_PROCESSING, src, chosen_option)
created_atom.OnCreatedFromProcessing(user, process_item, chosen_option, src)
to_chat(user, span_notice("You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.gender) == PLURAL ? "[initial(atom_to_create.name)]" : "[initial(atom_to_create.name)]\s"] from [src]."))
created_atoms.Add(created_atom)
@@ -1512,8 +1511,11 @@
qdel(src)
return
/atom/proc/OnCreatedFromProcessing(mob/living/user, obj/item/food, list/chosen_option, atom/original_atom)
return
/atom/proc/OnCreatedFromProcessing(mob/living/user, obj/item/work_tool, list/chosen_option, atom/original_atom)
SHOULD_CALL_PARENT(TRUE)
SEND_SIGNAL(src, COMSIG_ATOM_CREATEDBY_PROCESSING, original_atom, chosen_option)
ADD_TRAIT(src, TRAIT_FOOD_CHEF_MADE, REF(user))
//! Tool-specific behavior procs.
///

View File

@@ -932,11 +932,11 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e
MO.desc = "Looks like this was \an [src] some time ago."
..()
/obj/item/proc/microwave_act(obj/machinery/microwave/M)
if(SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M) & COMPONENT_SUCCESFUL_MICROWAVE)
return TRUE
if(istype(M) && M.dirty < 100)
M.dirty++
/obj/item/proc/microwave_act(obj/machinery/microwave/microwave_source, mob/microwaver)
SHOULD_CALL_PARENT(TRUE)
return SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, microwave_source, microwaver)
/obj/item/proc/grind_requirements(obj/machinery/reagentgrinder/R) //Used to check for extra requirements for grinding an object
return TRUE
@@ -1481,11 +1481,6 @@ GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/e
/obj/item/proc/set_painting_tool_color(chosen_color)
SEND_SIGNAL(src, COMSIG_PAINTING_TOOL_SET_COLOR, chosen_color)
/// Triggered from a silver slime reaction, sends a signal for the listener in component/edible
/obj/item/proc/mark_silver_slime_reaction()
SIGNAL_HANDLER
SEND_SIGNAL(src, COMSIG_FOOD_SILVER_SPAWNED)
/**
* Returns null if this object cannot be used to interact with physical writing mediums such as paper.
* Returns a list of key attributes for this object interacting with paper otherwise.

View File

@@ -242,11 +242,12 @@
. = ..()
. += "[icon_state]-[result]"
/obj/item/dice/microwave_act(obj/machinery/microwave/M)
/obj/item/dice/microwave_act(obj/machinery/microwave/microwave_source, mob/microwaver)
if(microwave_riggable)
rigged = DICE_BASICALLY_RIGGED
rigged_value = result
..(M)
return ..() | COMPONENT_MICROWAVE_SUCCESS
// Die of fate stuff
/obj/item/dice/d20/fate

View File

@@ -26,8 +26,6 @@
var/list/eatverbs
///How much reagents per bite
var/bite_consumption
///What you get if you microwave the food. Use baking for raw things, use microwaving for already cooked things
var/microwaved_type
///Type of atom thats spawned after eating this item
var/trash_type
///How much junkiness this food has? God I should remove junkiness soon
@@ -65,14 +63,9 @@
MakeGrillable()
MakeDecompose(mapload)
MakeBakeable()
make_microwavable()
ADD_TRAIT(src, FISHING_BAIT_TRAIT, INNATE_TRAIT)
/obj/item/food/examine(mob/user)
. = ..()
if(foodtypes)
var/list/types = bitfield_to_list(foodtypes, FOOD_FLAGS)
. += span_notice("It is [lowertext(english_list(types))].")
///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/MakeEdible()
AddComponent(/datum/component/edible,\
@@ -84,7 +77,6 @@
tastes = tastes,\
eatverbs = eatverbs,\
bite_consumption = bite_consumption,\
microwaved_type = microwaved_type,\
junkiness = junkiness)
@@ -104,6 +96,10 @@
AddComponent(/datum/component/bakeable, /obj/item/food/badrecipe, rand(25 SECONDS, 40 SECONDS), FALSE)
return
/// This proc handles the microwave component. Overwrite if you want special microwave results.
/// By default, all food is microwavable. However, they will be microwaved into a bad recipe (burnt mess).
/obj/item/food/proc/make_microwavable()
AddElement(/datum/element/microwavable)
///This proc handles trash components, overwrite this if you want the object to spawn trash
/obj/item/food/proc/MakeLeaveTrash()
@@ -116,8 +112,3 @@
/obj/item/food/proc/MakeDecompose(mapload)
if(!preserved_food)
AddComponent(/datum/component/decomposition, mapload, decomp_req_handle, decomp_flags = foodtypes, decomp_result = decomp_type, ant_attracting = ant_attracting, custom_time = decomposition_time)
/obj/item/food/mark_silver_slime_reaction()
//Adds this flag to prevent it from exporting for profit from cargo
food_flags |= FOOD_SILVER_SPAWNED
return ..()

View File

@@ -185,9 +185,8 @@
/obj/item/food/cake/birthday/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/birthday, 5, 3 SECONDS, table_required = TRUE)
/obj/item/food/cake/birthday/microwave_act(obj/machinery/microwave/microwave) //super sekrit club
new /obj/item/clothing/head/utility/hardhat/cakehat(get_turf(src))
qdel(src)
/obj/item/food/cake/birthday/make_microwavable() // super sekrit club
AddElement(/datum/element/microwavable, /obj/item/clothing/head/utility/hardhat/cakehat)
/obj/item/food/cakeslice/birthday
name = "birthday cake slice"
@@ -209,6 +208,9 @@
/obj/item/food/cake/birthday/energy/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/birthday/energy, 5, 3 SECONDS, table_required = TRUE)
/obj/item/food/cake/birthday/energy/make_microwavable() //super sekriter club
AddElement(/datum/element/microwavable, /obj/item/clothing/head/utility/hardhat/cakehat/energycake)
/obj/item/food/cake/birthday/energy/proc/energy_bite(mob/living/user)
to_chat(user, "<font color='red' size='5'>As you eat the cake, you accidentally hurt yourself on the embedded energy sword!</font>")
user.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
@@ -220,10 +222,6 @@
return
energy_bite(target_mob, user)
/obj/item/food/cake/birthday/energy/microwave_act(obj/machinery/microwave/M) //super sekriter club
new /obj/item/clothing/head/utility/hardhat/cakehat/energycake(get_turf(src))
qdel(src)
/obj/item/food/cakeslice/birthday/energy
name = "energy cake slice"
desc = "For the traitor on the go."
@@ -481,6 +479,12 @@
/obj/item/food/cake/pavlova/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pavlova, 5, 3 SECONDS, table_required = TRUE)
/obj/item/food/cake/pavlova/nuts
foodtypes = NUTS | FRUIT | SUGAR
/obj/item/food/cake/pavlova/nuts/MakeProcessable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pavlova/nuts, 5, 30, table_required = TRUE)
/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."

View File

@@ -61,13 +61,15 @@
name = "curd cheese"
desc = "Known by many names throughout human cuisine, curd cheese is useful for a wide variety of dishes."
icon_state = "curd_cheese"
microwaved_type = /obj/item/food/cheese/cheese_curds
food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3, /datum/reagent/consumable/cream = 1)
tastes = list("cream" = 1, "cheese" = 1)
foodtypes = DAIRY
w_class = WEIGHT_CLASS_SMALL
rat_heal = 35
/obj/item/food/curd_cheese/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/food/cheese/cheese_curds)
/obj/item/food/cheese/cheese_curds
name = "cheese curds"
desc = "Not to be mistaken for curd cheese. Tasty deep fried."

View File

@@ -6,17 +6,8 @@
bite_consumption = 2
/obj/item/food/deepfryholder/MakeEdible()
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/On_Consume))
. = ..()
AddComponent(/datum/component/edible, on_consume = CALLBACK(src, .proc/On_Consume))
/obj/item/food/deepfryholder/Initialize(mapload, obj/item/fried)
if(!fried)

View File

@@ -5,27 +5,35 @@
desc = "The food of choice for the seasoned traitor."
icon_state = "donkpocket"
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2)
microwaved_type = /obj/item/food/donkpocket/warm
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
foodtypes = GRAIN
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
//donk pockets cook quick... try not to burn them for using an unoptimal tool
/// What type of donk pocket we're warmed into via baking or microwaving.
var/warm_type = /obj/item/food/donkpocket/warm
/// The lower end for how long it takes to bake
var/baking_time_short = 25 SECONDS
/// The upper end for how long it takes to bake
var/baking_time_long = 30 SECONDS
/obj/item/food/donkpocket/MakeBakeable()
AddComponent(/datum/component/bakeable, microwaved_type, rand(25 SECONDS, 30 SECONDS), TRUE, TRUE)
AddComponent(/datum/component/bakeable, warm_type, rand(baking_time_short, baking_time_long), TRUE, TRUE)
/obj/item/food/donkpocket/make_microwavable()
AddElement(/datum/element/microwavable, warm_type)
/obj/item/food/donkpocket/warm
name = "warm Donk-pocket"
desc = "The heated food of choice for the seasoned traitor."
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/medicine/omnizine = 6)
microwaved_type = null
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
foodtypes = GRAIN
///Override for fast-burning food
/obj/item/food/donkpocket/warm/MakeBakeable()
AddComponent(/datum/component/bakeable, /obj/item/food/badrecipe, rand(10 SECONDS, 15 SECONDS), FALSE)
// Warmed donk pockets will burn if you leave them in the oven or microwave.
warm_type = /obj/item/food/badrecipe
baking_time_short = 10 SECONDS
baking_time_long = 15 SECONDS
/obj/item/food/dankpocket
name = "\improper Dank-pocket"
@@ -40,10 +48,11 @@
desc = "The classic snack food, now with a heat-activated spicy flair."
icon_state = "donkpocketspicy"
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/capsaicin = 2)
microwaved_type = /obj/item/food/donkpocket/warm/spicy
tastes = list("meat" = 2, "dough" = 2, "spice" = 1)
foodtypes = GRAIN
warm_type = /obj/item/food/donkpocket/warm/spicy
/obj/item/food/donkpocket/warm/spicy
name = "warm Spicy-pocket"
desc = "The classic snack food, now maybe a bit too spicy."
@@ -57,10 +66,11 @@
desc = "An east-asian take on the classic stationside snack."
icon_state = "donkpocketteriyaki"
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/soysauce = 2)
microwaved_type = /obj/item/food/donkpocket/warm/teriyaki
tastes = list("meat" = 2, "dough" = 2, "soy sauce" = 2)
foodtypes = GRAIN
warm_type = /obj/item/food/donkpocket/warm/teriyaki
/obj/item/food/donkpocket/warm/teriyaki
name = "warm Teriyaki-pocket"
desc = "An east-asian take on the classic stationside snack, now steamy and warm."
@@ -74,10 +84,11 @@
desc = "Delicious, cheesy and surprisingly filling."
icon_state = "donkpocketpizza"
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/consumable/tomatojuice = 2)
microwaved_type = /obj/item/food/donkpocket/warm/pizza
tastes = list("meat" = 2, "dough" = 2, "cheese"= 2)
foodtypes = GRAIN
warm_type = /obj/item/food/donkpocket/warm/pizza
/obj/item/food/donkpocket/warm/pizza
name = "warm Pizza-pocket"
desc = "Delicious, cheesy, and even better when hot."
@@ -91,10 +102,11 @@
desc = "The award-winning donk-pocket that won the hearts of clowns and humans alike."
icon_state = "donkpocketbanana"
food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/banana = 4)
microwaved_type = /obj/item/food/donkpocket/warm/honk
tastes = list("banana" = 2, "dough" = 2, "children's antibiotics" = 1)
foodtypes = GRAIN
warm_type = /obj/item/food/donkpocket/warm/honk
/obj/item/food/donkpocket/warm/honk
name = "warm Honk-pocket"
desc = "The award-winning donk-pocket, now warm and toasty."
@@ -108,10 +120,11 @@
desc = "A relentlessly sweet donk-pocket first created for use in Operation Dessert Storm."
icon_state = "donkpocketberry"
food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/berryjuice = 3)
microwaved_type = /obj/item/food/donkpocket/warm/berry
tastes = list("dough" = 2, "jam" = 2)
foodtypes = GRAIN
warm_type = /obj/item/food/donkpocket/warm/berry
/obj/item/food/donkpocket/warm/berry
name = "warm Berry-pocket"
desc = "A relentlessly sweet donk-pocket, now warm and delicious."
@@ -125,10 +138,11 @@
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least." //Only a monster would craft this.
icon_state = "donkpocketgondola"
food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/protein = 2, /datum/reagent/gondola_mutation_toxin = 5)
microwaved_type = /obj/item/food/donkpocket/warm/gondola
tastes = list("meat" = 2, "dough" = 2, "inner peace" = 1)
foodtypes = GRAIN
warm_type = /obj/item/food/donkpocket/warm/gondola
/obj/item/food/donkpocket/warm/gondola
name = "warm Gondola-pocket"
desc = "The choice to use real gondola meat in the recipe is controversial, to say the least."

View File

@@ -24,18 +24,8 @@
///Override for checkliked callback
/obj/item/food/donut/MakeEdible()
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,\
junkiness = junkiness,\
check_liked = CALLBACK(src, .proc/check_liked))
. = ..()
AddComponent(/datum/component/edible, check_liked = CALLBACK(src, .proc/check_liked))
/obj/item/food/donut/proc/decorate_donut()
if(is_decorated || !decorated_icon)

View File

@@ -19,7 +19,6 @@
icon_state = "egg"
inhand_icon_state = "egg"
food_reagents = list(/datum/reagent/consumable/eggyolk = 2, /datum/reagent/consumable/eggwhite = 4)
microwaved_type = /obj/item/food/boiledegg
foodtypes = MEAT | RAW
w_class = WEIGHT_CLASS_TINY
ant_attracting = FALSE
@@ -27,12 +26,17 @@
decomp_req_handle = TRUE //so laid eggs can actually become chickens
var/static/chick_count = 0 //I copied this from the chicken_count (note the "en" in there) variable from chicken code.
/obj/item/food/egg/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/food/boiledegg)
/obj/item/food/egg/rotten
food_reagents = list(/datum/reagent/consumable/eggrot = 10, /datum/reagent/consumable/mold = 10)
microwaved_type = /obj/item/food/boiledegg/rotten
foodtypes = GROSS
preserved_food = TRUE
/obj/item/food/egg/rotten/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/food/boiledegg/rotten)
/obj/item/food/egg/gland
desc = "An egg! It looks weird..."

View File

@@ -239,19 +239,8 @@
update_icon() // make sure the popsicle overlay is primed so it's not just a stick until you start eating it
/obj/item/food/popsicle/MakeEdible()
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,\
junkiness = junkiness,\
after_eat = CALLBACK(src, .proc/after_bite))
. = ..()
AddComponent(/datum/component/edible, after_eat = CALLBACK(src, .proc/after_bite))
/obj/item/food/popsicle/update_overlays()
. = ..()

View File

@@ -391,11 +391,11 @@
/obj/item/food/meat/steak/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/OnMicrowaveCooked)
RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/on_microwave_cooked)
/obj/item/food/meat/steak/proc/OnMicrowaveCooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
/obj/item/food/meat/steak/proc/on_microwave_cooked(datum/source, atom/source_item, cooking_efficiency = 1)
SIGNAL_HANDLER
name = "[source_item.name] steak"
/obj/item/food/meat/steak/plain
@@ -406,16 +406,18 @@
foodtypes = MEAT | GORE
///Make sure the steak has the correct name
/obj/item/food/meat/steak/plain/human/OnMicrowaveCooked(datum/source, obj/item/source_item, cooking_efficiency = 1)
/obj/item/food/meat/steak/plain/human/on_microwave_cooked(datum/source, atom/source_item, cooking_efficiency = 1)
. = ..()
if(istype(source_item, /obj/item/food/meat))
var/obj/item/food/meat/origin_meat = source_item
subjectname = origin_meat.subjectname
subjectjob = origin_meat.subjectjob
if(subjectname)
name = "[origin_meat.subjectname] meatsteak"
else if(subjectjob)
name = "[origin_meat.subjectjob] meatsteak"
if(!istype(source_item, /obj/item/food/meat))
return
var/obj/item/food/meat/origin_meat = source_item
subjectname = origin_meat.subjectname
subjectjob = origin_meat.subjectjob
if(subjectname)
name = "[origin_meat.subjectname] meatsteak"
else if(subjectjob)
name = "[origin_meat.subjectjob] meatsteak"
/obj/item/food/meat/steak/killertomato
@@ -498,8 +500,8 @@
/obj/item/food/meat/rawcutlet/MakeGrillable()
AddComponent(/datum/component/grillable, /obj/item/food/meat/cutlet/plain, rand(35 SECONDS, 50 SECONDS), TRUE, TRUE)
/obj/item/food/meat/rawcutlet/OnCreatedFromProcessing(mob/living/user, obj/item/item, list/chosen_option, atom/original_atom)
..()
/obj/item/food/meat/rawcutlet/OnCreatedFromProcessing(mob/living/user, obj/item/work_tool, list/chosen_option, atom/original_atom)
. = ..()
if(!istype(original_atom, /obj/item/food/meat/slab))
return
var/obj/item/food/meat/slab/original_slab = original_atom
@@ -602,14 +604,17 @@
/obj/item/food/meat/cutlet/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/OnMicrowaveCooked)
RegisterSignal(src, COMSIG_ITEM_MICROWAVE_COOKED, .proc/on_microwave_cooked)
///This proc handles setting up the correct meat name for the cutlet, this should definitely be changed with the food rework.
/obj/item/food/meat/cutlet/proc/OnMicrowaveCooked(datum/source, atom/source_item, cooking_efficiency)
/obj/item/food/meat/cutlet/proc/on_microwave_cooked(datum/source, atom/source_item, cooking_efficiency)
SIGNAL_HANDLER
if(istype(source_item, /obj/item/food/meat/rawcutlet))
var/obj/item/food/meat/rawcutlet/original_cutlet = source_item
name = "[original_cutlet.meat_type] cutlet"
if(!istype(source_item, /obj/item/food/meat/rawcutlet))
return
var/obj/item/food/meat/rawcutlet/original_cutlet = source_item
name = "[original_cutlet.meat_type] cutlet"
/obj/item/food/meat/cutlet/plain
@@ -617,14 +622,16 @@
tastes = list("tender meat" = 1)
foodtypes = MEAT | GORE
/obj/item/food/meat/cutlet/plain/human/OnMicrowaveCooked(datum/source, atom/source_item, cooking_efficiency)
/obj/item/food/meat/cutlet/plain/human/on_microwave_cooked(datum/source, atom/source_item, cooking_efficiency)
. = ..()
if(istype(source_item, /obj/item/food/meat))
var/obj/item/food/meat/origin_meat = source_item
if(subjectname)
name = "[origin_meat.subjectname] [initial(name)]"
else if(subjectjob)
name = "[origin_meat.subjectjob] [initial(name)]"
if(!istype(source_item, /obj/item/food/meat))
return
var/obj/item/food/meat/origin_meat = source_item
if(subjectname)
name = "[origin_meat.subjectname] [initial(name)]"
else if(subjectjob)
name = "[origin_meat.subjectjob] [initial(name)]"
/obj/item/food/meat/cutlet/killertomato
name = "killer tomato cutlet"

View File

@@ -169,7 +169,7 @@
/obj/item/food/badrecipe/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_ITEM_GRILLED, .proc/OnGrill)
RegisterSignal(src, COMSIG_ITEM_GRILL_PROCESS, .proc/OnGrill)
/obj/item/food/badrecipe/moldy
name = "moldy mess"
@@ -467,18 +467,8 @@
hallucinate(loc)
/obj/item/food/bubblegum/bubblegum/MakeEdible()
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,\
junkiness = junkiness,\
on_consume = CALLBACK(src, .proc/OnConsume))
. = ..()
AddComponent(/datum/component/edible, on_consume = CALLBACK(src, .proc/OnConsume))
/obj/item/food/bubblegum/bubblegum/proc/OnConsume(mob/living/eater, mob/living/feeder)
if(iscarbon(eater))
@@ -689,18 +679,8 @@
///Override for checkliked callback
/obj/item/food/rationpack/MakeEdible()
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,\
junkiness = junkiness,\
check_liked = CALLBACK(src, .proc/check_liked))
. = ..()
AddComponent(/datum/component/edible, check_liked = CALLBACK(src, .proc/check_liked))
/obj/item/food/rationpack/proc/check_liked(fraction, mob/mob) //Nobody likes rationpacks. Nobody.
return FOOD_DISLIKED
@@ -804,12 +784,17 @@
icon_state = "ready_donk"
trash_type = /obj/item/trash/ready_donk
food_reagents = list(/datum/reagent/consumable/nutriment = 5)
microwaved_type = /obj/item/food/ready_donk/warm
tastes = list("food?" = 2, "laziness" = 1)
foodtypes = MEAT | JUNKFOOD
food_flags = FOOD_FINGER_FOOD
w_class = WEIGHT_CLASS_SMALL
/// What type of ready-donk are we warmed into?
var/warm_type = /obj/item/food/ready_donk/warm
/obj/item/food/ready_donk/make_microwavable()
AddElement(/datum/element/microwavable, warm_type)
/obj/item/food/ready_donk/examine_more(mob/user)
. = ..()
. += span_notice("<i>You browse the back of the box...</i>")
@@ -823,16 +808,19 @@
desc = "A quick Donk-dinner, now with flavour! And it's even hot!"
icon_state = "ready_donk_warm"
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/omnizine = 3)
microwaved_type = null
tastes = list("food?" = 2, "laziness" = 1)
// Don't burn your warn ready donks.
warm_type = /obj/item/food/badrecipe
/obj/item/food/ready_donk/mac_n_cheese
name = "\improper Ready-Donk: Donk-a-Roni"
desc = "Neon-orange mac n' cheese in seconds!"
microwaved_type = /obj/item/food/ready_donk/warm/mac_n_cheese
tastes = list("cheesy pasta" = 2, "laziness" = 1)
foodtypes = GRAIN | DAIRY | JUNKFOOD
warm_type = /obj/item/food/ready_donk/warm/mac_n_cheese
/obj/item/food/ready_donk/warm/mac_n_cheese
name = "warm Ready-Donk: Donk-a-Roni"
desc = "Neon-orange mac n' cheese, ready to eat!"
@@ -843,10 +831,11 @@
/obj/item/food/ready_donk/donkhiladas
name = "\improper Ready-Donk: Donkhiladas"
desc = "Donk Co's signature Donkhiladas with Donk sauce, for an 'authentic' taste of Mexico."
microwaved_type = /obj/item/food/ready_donk/warm/donkhiladas
tastes = list("enchiladas" = 2, "laziness" = 1)
foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD
warm_type = /obj/item/food/ready_donk/warm/donkhiladas
/obj/item/food/ready_donk/warm/donkhiladas
name = "warm Ready-Donk: Donkhiladas"
desc = "Donk Co's signature Donkhiladas with Donk sauce, served as hot as the Mexican sun."

View File

@@ -63,11 +63,13 @@
name = "ricebowl"
desc = "A bowl of raw rice."
icon_state = "ricebowl"
microwaved_type = /obj/item/food/salad/boiledrice
food_reagents = list(/datum/reagent/consumable/nutriment = 4)
tastes = list("rice" = 1)
foodtypes = GRAIN | RAW
/obj/item/food/salad/ricebowl/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/food/salad/boiledrice)
/obj/item/food/salad/boiledrice
name = "boiled rice"
desc = "A warm bowl of rice."

View File

@@ -30,18 +30,8 @@
var/revelation = FALSE
/obj/item/food/candy/bronx/MakeEdible()
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,\
junkiness = junkiness,\
after_eat = CALLBACK(src, .proc/after_eat))
. = ..()
AddComponent(/datum/component/edible, after_eat = CALLBACK(src, .proc/after_eat))
/obj/item/food/candy/bronx/proc/after_eat(mob/living/eater)
if(ishuman(eater))

View File

@@ -5,21 +5,24 @@
foodtypes = GRAIN
venue_value = FOOD_PRICE_CHEAP
/obj/item/food/spaghetti/Initialize(mapload)
. = ..()
if(!microwaved_type) // This isn't cooked, why would you put uncooked spaghetti in your pocket?
var/list/display_message = list(
span_notice("Something wet falls out of their pocket and hits the ground. Is that... [name]?"),
span_warning("Oh shit! All your pocket [name] fell out!"))
AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg', MEMORY_SPAGHETTI_SPILL)
// Why are you putting cooked spaghetti in your pockets?
/obj/item/food/spaghetti/make_microwavable()
var/list/display_message = list(
span_notice("Something wet falls out of their pocket and hits the ground. Is that... [name]?"),
span_warning("Oh shit! All your pocket [name] fell out!"))
AddComponent(/datum/component/spill, display_message, 'sound/effects/splat.ogg', MEMORY_SPAGHETTI_SPILL)
return ..()
/obj/item/food/spaghetti/raw
name = "spaghetti"
desc = "Now that's a nic'e pasta!"
icon_state = "spaghetti"
microwaved_type = /obj/item/food/spaghetti/boiledspaghetti
tastes = list("pasta" = 1)
/obj/item/food/spaghetti/raw/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/food/spaghetti/boiledspaghetti)
/obj/item/food/spaghetti/boiledspaghetti
name = "boiled spaghetti"
desc = "A plain dish of noodles, this needs more ingredients."

View File

@@ -395,6 +395,10 @@
. = ..()
if(HAS_TRAIT(user, TRAIT_GARLIC_BREATH))
kiss_type = /obj/projectile/kiss/french
if(HAS_TRAIT(user, TRAIT_CHEF_KISS))
kiss_type = /obj/projectile/kiss/chef
var/obj/projectile/blown_kiss = new kiss_type(get_turf(user))
user.visible_message("<b>[user]</b> blows \a [blown_kiss] at [target]!", span_notice("You blow \a [blown_kiss] at [target]!"))
@@ -548,3 +552,33 @@
//Phwoar
living_target.reagents.add_reagent(/datum/reagent/consumable/garlic, 1)
living_target.visible_message("[living_target] has a funny look on [living_target.p_their()] face.", "Wow, that is a strong after taste of garlic!", vision_distance=COMBAT_MESSAGE_RANGE)
/obj/projectile/kiss/chef
name = "chef's kiss"
// If our chef's kiss hits a food item, we will improve it with love.
/obj/projectile/kiss/chef/on_hit(atom/target, blocked, pierce_hit)
. = ..()
if(!IS_EDIBLE(target) || !target.reagents)
return
if(!firer || !target.Adjacent(firer))
return
// From here on, no message
suppressed = SUPPRESSED_VERY
if(!HAS_TRAIT_FROM(target, TRAIT_FOOD_CHEF_MADE, REF(firer)))
to_chat(firer, span_warning("Wait a second, you didn't make this [target.name]. How can you claim it as your own?"))
return
if(target.reagents.has_reagent(/datum/reagent/love))
to_chat(firer, span_warning("You've already blessed [target.name] with your heart and soul."))
return
var/amount_nutriment = target.reagents.get_multiple_reagent_amounts(typesof(/datum/reagent/consumable/nutriment))
if(amount_nutriment <= 0)
to_chat(firer, span_warning("There's not enough nutrition in [target.name] for it to be a proper meal."))
return
to_chat(firer, span_green("You deliver a chef's kiss over [target], declaring it perfect."))
target.visible_message(span_notice("[firer] delivers a chef's kiss over [target]."), ignored_mobs = firer)
target.reagents.add_reagent(/datum/reagent/love, clamp(amount_nutriment / 4, 1, 10)) // clamped to about half of the most dense food I think we have (super bite burger)

View File

@@ -361,6 +361,9 @@
grind_results = list(/datum/reagent/consumable/aloejuice = 1)
merge_type = /obj/item/stack/medical/aloe
/obj/item/stack/medical/aloe/fresh
amount = 2
/obj/item/stack/medical/bone_gel
name = "bone gel"
singular_name = "bone gel"

View File

@@ -287,6 +287,12 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
//Step two - washing..... it's actually in washing machine code.
//Step three - drying
/obj/item/stack/sheet/wethide
/obj/item/stack/sheet/wethide/Initialize(mapload)
. = ..()
AddElement(/datum/element/microwavable, /obj/item/stack/sheet/leather)
/obj/item/stack/sheet/wethide/should_atmos_process(datum/gas_mixture/air, exposed_temperature)
return (exposed_temperature > drying_threshold_temperature)
@@ -297,11 +303,6 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
wetness = initial(wetness)
use(1)
/obj/item/stack/sheet/wethide/microwave_act(obj/machinery/microwave/MW)
..()
new /obj/item/stack/sheet/leather(drop_location(), amount)
qdel(src)
/obj/item/stack/sheet/animalhide/carp
name = "carp scales"
desc = "The scaly skin of a space carp. It looks quite beatiful when detached from the foul creature who once wore it."

View File

@@ -705,9 +705,5 @@
fingerprintslast = from.fingerprintslast
//TODO bloody overlay
/obj/item/stack/microwave_act(obj/machinery/microwave/M)
if(istype(M) && M.dirty < 100)
M.dirty += amount
#undef STACK_CHECK_CARDINALS
#undef STACK_CHECK_ADJACENT

View File

@@ -150,7 +150,7 @@
var/obj/burned_object = burn_target
if(grill && isitem(burned_object))
var/obj/item/grilled_item = burned_object
SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, delta_time) //Not a big fan, maybe make this use fire_act() in the future.
SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILL_PROCESS, src, delta_time) //Not a big fan, maybe make this use fire_act() in the future.
continue
burned_object.fire_act(1000, 250 * delta_time)

View File

@@ -13,10 +13,10 @@
var/cost_obtained_from_venue_value = FALSE
/datum/export/food/get_cost(obj/object, allowed_categories, apply_elastic)
var/obj/item/food/sold_food = object
if(sold_food.food_flags & FOOD_SILVER_SPAWNED)
if(HAS_TRAIT(object, TRAIT_FOOD_SILVER))
return FOOD_PRICE_WORTHLESS
var/obj/item/food/sold_food = object
if(!cost_obtained_from_venue_value)
cost = sold_food.venue_value
cost_obtained_from_venue_value = TRUE

View File

@@ -20,13 +20,15 @@
contains = list(/obj/item/food/sandwich = 5)
crate_name = "outsourced food crate"
/datum/supply_pack/exploration/catering/fill(obj/structure/closet/crate/C)
/datum/supply_pack/exploration/catering/fill(obj/structure/closet/crate/crate)
. = ..()
if(prob(30))
for(var/obj/item/food/F in C)
F.name = "spoiled [F.name]"
F.foodtypes |= GROSS
F.MakeEdible()
if(!prob(30))
return
for(var/obj/item/food/food_item in crate)
// makes all of our items GROSS
food_item.name = "spoiled [food_item.name]"
food_item.AddComponent(/datum/component/edible, foodtypes = GROSS)
/datum/supply_pack/exploration/shrubbery
name = "Shrubbery Crate"

View File

@@ -82,18 +82,8 @@
var/datum/weakref/clothing
/obj/item/food/clothing/MakeEdible()
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,\
junkiness = junkiness,\
after_eat = CALLBACK(src, .proc/after_eat))
. = ..()
AddComponent(/datum/component/edible, after_eat = CALLBACK(src, .proc/after_eat))
/obj/item/food/clothing/proc/after_eat(mob/eater)
var/obj/item/clothing/resolved_clothing = clothing.resolve()

View File

@@ -77,10 +77,13 @@
return
return ..()
/obj/item/clothing/head/costume/foilhat/microwave_act(obj/machinery/microwave/M)
/obj/item/clothing/head/costume/foilhat/microwave_act(obj/machinery/microwave/microwave_source, mob/microwaver)
. = ..()
if(!warped)
warp_up()
if(warped)
return
warp_up()
return . | COMPONENT_MICROWAVE_SUCCESS
/obj/item/clothing/head/costume/foilhat/proc/call_suicide(datum/source)
SIGNAL_HANDLER

View File

@@ -166,6 +166,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list(
add_filter("entropic_ray", 10, list("type" = "rays", "size" = 35, "color" = COLOR_VIVID_YELLOW))
addtimer(CALLBACK(src, .proc/blow_up), 5 SECONDS)
frying = new /obj/item/food/deepfryholder(src, frying_item)
ADD_TRAIT(frying, TRAIT_FOOD_CHEF_MADE, REF(user))
icon_state = "fryer_on"
fry_loop.start()

View File

@@ -96,8 +96,10 @@
griddled_objects += item_to_grill
item_to_grill.flags_1 |= IS_ONTOP_1
item_to_grill.vis_flags |= VIS_INHERIT_PLANE
SEND_SIGNAL(item_to_grill, COMSIG_ITEM_GRILL_PLACED_ON, user)
RegisterSignal(item_to_grill, COMSIG_MOVABLE_MOVED, .proc/ItemMoved)
RegisterSignal(item_to_grill, COMSIG_GRILL_COMPLETED, .proc/GrillCompleted)
RegisterSignal(item_to_grill, COMSIG_ITEM_GRILLED, .proc/GrillCompleted)
RegisterSignal(item_to_grill, COMSIG_PARENT_QDELETING, .proc/ItemRemovedFromGrill)
update_grill_audio()
update_appearance()
@@ -108,7 +110,7 @@
ungrill.vis_flags &= ~VIS_INHERIT_PLANE
griddled_objects -= ungrill
vis_contents -= ungrill
UnregisterSignal(ungrill, list(COMSIG_GRILL_COMPLETED, COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING))
UnregisterSignal(ungrill, list(COMSIG_ITEM_GRILLED, COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING))
update_grill_audio()
/obj/machinery/griddle/proc/ItemMoved(obj/item/I, atom/OldLoc, Dir, Forced)
@@ -153,7 +155,7 @@
..()
for(var/i in griddled_objects)
var/obj/item/griddled_item = i
if(SEND_SIGNAL(griddled_item, COMSIG_ITEM_GRILLED, src, delta_time) & COMPONENT_HANDLED_GRILLING)
if(SEND_SIGNAL(griddled_item, COMSIG_ITEM_GRILL_PROCESS, src, delta_time) & COMPONENT_HANDLED_GRILLING)
continue
griddled_item.fire_act(1000) //Hot hot hot!
if(prob(10))

View File

@@ -68,8 +68,7 @@
return
else if(!grilled_item && user.transferItemToLoc(I, src))
grilled_item = I
RegisterSignal(grilled_item, COMSIG_GRILL_COMPLETED, .proc/GrillCompleted)
ADD_TRAIT(grilled_item, TRAIT_FOOD_GRILLED, "boomers")
RegisterSignal(grilled_item, COMSIG_ITEM_GRILLED, .proc/GrillCompleted)
to_chat(user, span_notice("You put the [grilled_item] on [src]."))
update_appearance()
grill_loop.start()
@@ -89,7 +88,7 @@
smoke.set_up(1, holder = src, location = loc)
smoke.start()
if(grilled_item)
SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, delta_time)
SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILL_PROCESS, src, delta_time)
grill_time += delta_time
grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.5 * delta_time)
grill_fuel -= GRILL_FUELUSAGE_ACTIVE * delta_time
@@ -136,8 +135,8 @@
/obj/machinery/grill/proc/finish_grill()
if(grilled_item)
SEND_SIGNAL(grilled_item, COMSIG_GRILL_FOOD, grilled_item, grill_time)
UnregisterSignal(grilled_item, COMSIG_GRILL_COMPLETED)
grilled_item.AddElement(/datum/element/grilled_item, grill_time)
UnregisterSignal(grilled_item, COMSIG_ITEM_GRILLED)
grill_time = 0
grill_loop.stop()

View File

@@ -1,4 +1,18 @@
//Microwaving doesn't use recipes, instead it calls the microwave_act of the objects. For food, this creates something based on the food's cooked_type
// Microwaving doesn't use recipes, instead it calls the microwave_act of the objects.
// For food, this creates something based on the food's cooked_type
/// Values based on microwave success
#define MICROWAVE_NORMAL 0
#define MICROWAVE_MUCK 1
#define MICROWAVE_PRE 2
/// Values for how broken the microwave is
#define NOT_BROKEN 0
#define KINDA_BROKEN 1
#define REALLY_BROKEN 2
/// The max amount of dirtiness a microwave can be
#define MAX_MICROWAVE_DIRTINESS 100
/obj/machinery/microwave
name = "microwave oven"
@@ -14,9 +28,11 @@
light_power = 3
var/wire_disabled = FALSE // is its internal wire cut?
var/operating = FALSE
var/dirty = 0 // 0 to 100 // Does it need cleaning?
/// How dirty is it?
var/dirty = 0
var/dirty_anim_playing = FALSE
var/broken = 0 // 0, 1 or 2 // How broken is it???
/// How broken is it? NOT_BROKEN, KINDA_BROKEN, REALLY_BROKEN
var/broken = NOT_BROKEN
var/open = FALSE
var/max_n_of_items = 10
var/efficiency = 0
@@ -126,7 +142,7 @@
. = ..()
// All of these will use a full icon state instead
if (panel_open || dirty == 100 || broken || dirty_anim_playing)
if (panel_open || dirty == MAX_MICROWAVE_DIRTINESS || broken || dirty_anim_playing)
return .
var/ingredient_count = 0
@@ -184,7 +200,7 @@
icon_state = "mwb"
else if (dirty_anim_playing)
icon_state = "mwbloody1"
else if (dirty == 100)
else if (dirty == MAX_MICROWAVE_DIRTINESS)
icon_state = open ? "mwbloodyo" : "mwbloody"
else if(operating)
icon_state = "back_on"
@@ -199,7 +215,7 @@
/obj/machinery/microwave/wrench_act(mob/living/user, obj/item/tool)
. = ..()
if(dirty >= 100)
if(dirty >= MAX_MICROWAVE_DIRTINESS)
return FALSE
if(default_unfasten_wrench(user, tool))
update_appearance()
@@ -215,7 +231,7 @@
/obj/machinery/microwave/screwdriver_act(mob/living/user, obj/item/tool)
if(operating)
return
if(dirty >= 100)
if(dirty >= MAX_MICROWAVE_DIRTINESS)
return
if(default_deconstruction_screwdriver(user, icon_state, icon_state, tool))
update_appearance()
@@ -229,17 +245,17 @@
wires.interact(user)
return TRUE
if(broken > 0)
if(broken == 2 && O.tool_behaviour == TOOL_WIRECUTTER) // If it's broken and they're using a TOOL_WIRECUTTER
if(broken > NOT_BROKEN)
if(broken == REALLY_BROKEN && O.tool_behaviour == TOOL_WIRECUTTER) // If it's broken and they're using a TOOL_WIRECUTTER
user.visible_message(span_notice("[user] starts to fix part of \the [src]."), span_notice("You start to fix part of \the [src]..."))
if(O.use_tool(src, user, 20))
user.visible_message(span_notice("[user] fixes part of \the [src]."), span_notice("You fix part of \the [src]."))
broken = 1 // Fix it a bit
else if(broken == 1 && O.tool_behaviour == TOOL_WELDER) // If it's broken and they're doing the wrench
broken = KINDA_BROKEN // Fix it a bit
else if(broken == KINDA_BROKEN && O.tool_behaviour == TOOL_WELDER) // If it's broken and they're doing the wrench
user.visible_message(span_notice("[user] starts to fix part of \the [src]."), span_notice("You start to fix part of \the [src]..."))
if(O.use_tool(src, user, 20))
user.visible_message(span_notice("[user] fixes \the [src]."), span_notice("You fix \the [src]."))
broken = 0
broken = NOT_BROKEN
update_appearance()
return FALSE //to use some fuel
else
@@ -271,7 +287,7 @@
update_appearance()
return TRUE
if(dirty == 100) // The microwave is all dirty so can't be used!
if(dirty >= MAX_MICROWAVE_DIRTINESS) // The microwave is all dirty so can't be used!
to_chat(user, span_warning("\The [src] is dirty!"))
return TRUE
@@ -337,7 +353,7 @@
if("eject")
eject()
if("use")
cook()
cook(user)
if("examine")
examine(user)
@@ -349,10 +365,10 @@
playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3)
/obj/machinery/microwave/proc/cook()
/obj/machinery/microwave/proc/cook(mob/cooker)
if(machine_stat & (NOPOWER|BROKEN))
return
if(operating || broken > 0 || panel_open || !anchored || dirty == 100)
if(operating || broken > 0 || panel_open || !anchored || dirty >= MAX_MICROWAVE_DIRTINESS)
return
if(wire_disabled)
@@ -363,14 +379,19 @@
if(prob(max((5 / efficiency) - 5, dirty * 5))) //a clean unupgraded microwave has no risk of failure
muck()
return
for(var/obj/O in ingredients)
if(istype(O, /obj/item/food) || istype(O, /obj/item/grown))
continue
if(prob(min(dirty * 5, 100)))
start_can_fail()
return
break
start()
// How many items are we cooking that aren't already food items
var/non_food_ingedients = length(ingredients)
for(var/atom/movable/potential_fooditem as anything in ingredients)
if(IS_EDIBLE(potential_fooditem))
non_food_ingedients--
// If we're cooking non-food items we can fail randomly
if(length(non_food_ingedients) && prob(min(dirty * 5, 100)))
start_can_fail(cooker)
return
start(cooker)
/obj/machinery/microwave/proc/wzhzhzh()
visible_message(span_notice("\The [src] turns on."), null, span_hear("You hear a microwave humming."))
@@ -386,17 +407,13 @@
s.set_up(2, 1, src)
s.start()
#define MICROWAVE_NORMAL 0
#define MICROWAVE_MUCK 1
#define MICROWAVE_PRE 2
/obj/machinery/microwave/proc/start()
/obj/machinery/microwave/proc/start(mob/cooker)
wzhzhzh()
loop(MICROWAVE_NORMAL, 10)
loop(MICROWAVE_NORMAL, 10, cooker = cooker)
/obj/machinery/microwave/proc/start_can_fail()
/obj/machinery/microwave/proc/start_can_fail(mob/cooker)
wzhzhzh()
loop(MICROWAVE_PRE, 4)
loop(MICROWAVE_PRE, 4, cooker = cooker)
/obj/machinery/microwave/proc/muck()
wzhzhzh()
@@ -405,7 +422,7 @@
update_appearance()
loop(MICROWAVE_MUCK, 4)
/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2)) // standard wait is 10
/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * efficiency, 2), mob/cooker) // standard wait is 10
if((machine_stat & BROKEN) && type == MICROWAVE_PRE)
pre_fail()
return
@@ -413,15 +430,15 @@
if(!time || !length(ingredients))
switch(type)
if(MICROWAVE_NORMAL)
loop_finish()
loop_finish(cooker)
if(MICROWAVE_MUCK)
muck_finish()
if(MICROWAVE_PRE)
pre_success()
pre_success(cooker)
return
time--
use_power(active_power_usage)
addtimer(CALLBACK(src, .proc/loop, type, time, wait), wait)
addtimer(CALLBACK(src, .proc/loop, type, time, wait, cooker), wait)
/obj/machinery/microwave/power_change()
. = ..()
@@ -429,39 +446,45 @@
pre_fail()
eject()
/obj/machinery/microwave/proc/loop_finish()
/obj/machinery/microwave/proc/loop_finish(mob/cooker)
operating = FALSE
var/metal = 0
for(var/obj/item/O in ingredients)
O.microwave_act(src)
if(LAZYLEN(O.custom_materials))
if(O.custom_materials[GET_MATERIAL_REF(/datum/material/iron)])
metal += O.custom_materials[GET_MATERIAL_REF(/datum/material/iron)]
var/metal_amount = 0
for(var/obj/item/cooked_item in ingredients)
var/sigreturn = cooked_item.microwave_act(src, cooker)
if(sigreturn & COMPONENT_MICROWAVE_SUCCESS)
if(isstack(cooked_item))
var/obj/item/stack/cooked_stack = cooked_item
dirty += cooked_stack.amount
else
dirty++
if(metal)
metal_amount += (cooked_item.custom_materials?[GET_MATERIAL_REF(/datum/material/iron)] || 0)
if(metal_amount)
spark()
broken = 2
if(prob(max(metal / 2, 33)))
broken = REALLY_BROKEN
if(prob(max(metal_amount / 2, 33)))
explosion(src, heavy_impact_range = 1, light_impact_range = 2)
else
dump_inventory_contents()
after_finish_loop()
/obj/machinery/microwave/proc/pre_fail()
broken = 2
broken = REALLY_BROKEN
operating = FALSE
spark()
after_finish_loop()
/obj/machinery/microwave/proc/pre_success()
loop(MICROWAVE_NORMAL, 10)
/obj/machinery/microwave/proc/pre_success(mob/cooker)
loop(MICROWAVE_NORMAL, 10, cooker = cooker)
/obj/machinery/microwave/proc/muck_finish()
visible_message(span_warning("\The [src] gets covered in muck!"))
dirty = 100
dirty = MAX_MICROWAVE_DIRTINESS
dirty_anim_playing = FALSE
operating = FALSE
@@ -507,3 +530,10 @@
#undef MICROWAVE_NORMAL
#undef MICROWAVE_MUCK
#undef MICROWAVE_PRE
#undef NOT_BROKEN
#undef KINDA_BROKEN
#undef REALLY_BROKEN
#undef MAX_MICROWAVE_DIRTINESS

View File

@@ -66,7 +66,7 @@
var/worst_cooked_food_state = 0
for(var/obj/item/baked_item in used_tray.contents)
var/signal_result = SEND_SIGNAL(baked_item, COMSIG_ITEM_BAKED, src, delta_time)
var/signal_result = SEND_SIGNAL(baked_item, COMSIG_ITEM_OVEN_PROCESS, src, delta_time)
if(signal_result & COMPONENT_HANDLED_BAKING) //This means something responded to us baking!
if(signal_result & COMPONENT_BAKING_GOOD_RESULT && worst_cooked_food_state < OVEN_SMOKE_STATE_GOOD)
@@ -89,12 +89,12 @@
if(open && !used_tray && istype(I, /obj/item/plate/oven_tray))
if(user.transferItemToLoc(I, src, silent = FALSE))
to_chat(user, span_notice("You put [I] in [src]."))
add_tray_to_oven(I)
add_tray_to_oven(I, user)
else
return ..()
///Adds a tray to the oven, making sure the shit can get baked.
/obj/machinery/oven/proc/add_tray_to_oven(obj/item/plate/oven_tray)
/obj/machinery/oven/proc/add_tray_to_oven(obj/item/plate/oven_tray, mob/baker)
used_tray = oven_tray
if(!open)
@@ -105,13 +105,14 @@
oven_tray.pixel_y = OVEN_TRAY_Y_OFFSET
oven_tray.pixel_x = OVEN_TRAY_X_OFFSET
RegisterSignal(used_tray, COMSIG_MOVABLE_MOVED, .proc/ItemMoved)
RegisterSignal(used_tray, COMSIG_MOVABLE_MOVED, .proc/on_tray_moved)
update_baking_audio()
update_appearance()
///Called when the tray is moved out of the oven in some way
/obj/machinery/oven/proc/ItemMoved(obj/item/oven_tray, atom/OldLoc, Dir, Forced)
/obj/machinery/oven/proc/on_tray_moved(obj/item/oven_tray, atom/OldLoc, Dir, Forced)
SIGNAL_HANDLER
tray_removed_from_oven(oven_tray)
/obj/machinery/oven/proc/tray_removed_from_oven(obj/item/oven_tray)
@@ -139,6 +140,11 @@
if(used_tray)
begin_processing()
used_tray.vis_flags |= VIS_HIDE
// yeah yeah i figure you don't need connect loc for just baking trays
for(var/obj/item/baked_item in used_tray.contents)
SEND_SIGNAL(baked_item, COMSIG_ITEM_OVEN_PLACED_IN, src, user)
update_appearance()
update_baking_audio()
return TRUE

View File

@@ -2,6 +2,9 @@
var/real_parts
category = CAT_FOOD
/datum/crafting_recipe/food/on_craft_completion(mob/user, atom/result)
ADD_TRAIT(result, TRAIT_FOOD_CHEF_MADE, REF(user))
/datum/crafting_recipe/food/New()
real_parts = parts.Copy()
parts |= reqs

View File

@@ -170,13 +170,9 @@
/datum/reagent/consumable/korta_milk = 10,
/obj/item/food/grown/berries = 5
)
result = /obj/item/food/cake/pavlova
result = /obj/item/food/cake/pavlova/nuts
subcategory = CAT_CAKE
/datum/crafting_recipe/food/pavlovakorta/on_craft_completion(mob/user, obj/item/food/cake/pavlova/result)
result.foodtypes = NUTS | FRUIT | SUGAR
result.AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/pavlova/nuts, 5, 30)
/datum/crafting_recipe/food/bscvcake
name = "blackberry and strawberry vanilla cake"
reqs = list(

View File

@@ -79,19 +79,6 @@
QDEL_NULL(seed)
return ..()
/obj/item/food/grown/MakeEdible()
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,\
junkiness = junkiness)
/obj/item/food/grown/proc/make_dryable()
AddElement(/datum/element/dryable, type)

View File

@@ -26,6 +26,5 @@
juice_results = list(/datum/reagent/consumable/aloejuice = 0)
distill_reagent = /datum/reagent/consumable/ethanol/tequila
/obj/item/food/grown/aloe/microwave_act(obj/machinery/microwave/M)
new /obj/item/stack/medical/aloe(drop_location(), 2)
qdel(src)
/obj/item/food/grown/aloe/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/stack/medical/aloe/fresh)

View File

@@ -21,7 +21,6 @@
name = "ear of corn"
desc = "Needs some butter!"
icon_state = "corn"
microwaved_type = /obj/item/food/popcorn
trash_type = /obj/item/grown/corncob
bite_consumption_mod = 2
foodtypes = VEGETABLES
@@ -33,6 +32,9 @@
/obj/item/food/grown/corn/MakeBakeable()
AddComponent(/datum/component/bakeable, /obj/item/food/oven_baked_corn, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE)
/obj/item/food/grown/corn/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/food/popcorn)
/obj/item/grown/corncob
name = "corn cob"
desc = "A reminder of meals gone by."

View File

@@ -69,18 +69,8 @@
return //No drying
/obj/item/food/grown/holymelon/MakeEdible()
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, \
junkiness = junkiness, \
check_liked = CALLBACK(src, .proc/check_holyness))
. = ..()
AddComponent(/datum/component/edible, check_liked = CALLBACK(src, .proc/check_holyness))
/*
* Callback to be used with the edible component.

View File

@@ -64,7 +64,9 @@
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2)
gender = PLURAL
w_class = WEIGHT_CLASS_TINY
microwaved_type = /obj/item/food/onionrings
/obj/item/food/onion_slice/make_microwavable()
AddElement(/datum/element/microwavable, /obj/item/food/onionrings)
/obj/item/food/onion_slice/red
name = "red onion slices"

View File

@@ -44,9 +44,6 @@
return TRUE
return FALSE
/obj/item/grown/microwave_act(obj/machinery/microwave/M)
return
/obj/item/grown/on_grind()
. = ..()
for(var/i in 1 to grind_results.len)

View File

@@ -468,4 +468,13 @@
user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20)
. = ..()
/obj/item/skillchip/chefs_kiss
name = "K1SS skillchip"
auto_traits = list(TRAIT_CHEF_KISS)
skill_name = "Chef's Kiss"
skill_description = "Allows you to kiss food you've created to make them with love."
skill_icon = "cookie"
activate_message = span_notice("You recall learning from your grandmother how they baked their cookies with love.")
deactivate_message = span_notice("You forget all memories imparted upon you by your grandmother. Were they even your real grandma?")
#undef SKILLCHIP_CATEGORY_GENERAL

View File

@@ -46,7 +46,7 @@
spark_effect.set_up(2, 1, mod.wearer)
spark_effect.start()
mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5)
if(microwave_target.microwave_act())
if(microwave_target.microwave_act(microwaver = mod.wearer) & COMPONENT_MICROWAVE_SUCCESS)
playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE)
else
balloon_alert(mod.wearer, "can't be microwaved!")

View File

@@ -1277,6 +1277,13 @@
return round(cached_reagent.volume, CHEMICAL_QUANTISATION_LEVEL)
return 0
/datum/reagents/proc/get_multiple_reagent_amounts(list/reagents)
var/list/cached_reagents = reagent_list
for(var/datum/reagent/cached_reagent as anything in cached_reagents)
if(cached_reagent.type in reagents)
return round(cached_reagent.volume, CHEMICAL_QUANTISATION_LEVEL)
return 0
/// Get the purity of this reagent
/datum/reagents/proc/get_reagent_purity(reagent)
var/list/cached_reagents = reagent_list

View File

@@ -2812,3 +2812,39 @@
mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 1))
if(myseed)
myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5))
// I made this food....with love.
// Reagent added to food by chef's with a chef's kiss. Makes people happy.
/datum/reagent/love
name = "Love"
description = "This food's been made... with love."
color = "#ff7edd"
taste_description = "love"
taste_mult = 10
overdose_threshold = 50 // too much love is a bad thing
/datum/reagent/love/expose_mob(mob/living/exposed_mob, methods, reac_volume, show_message, touch_protection)
. = ..()
// A syringe is not grandma's cooking
if(methods & ~INGEST)
exposed_mob.reagents.del_reagent(type)
/datum/reagent/love/on_mob_metabolize(mob/living/metabolizer)
. = ..()
metabolizer.add_mood_event(name, /datum/mood_event/love_reagent)
/datum/reagent/love/on_mob_delete(mob/living/deleted_from)
. = ..()
// When we exit the system we'll leave the moodlet based on the amount we had
var/duration_of_moodlet = current_cycle * 20 SECONDS
deleted_from.clear_mood_event(name)
deleted_from.add_mood_event(name, /datum/mood_event/love_reagent, duration_of_moodlet)
/datum/reagent/love/overdose_process(mob/living/metabolizer, delta_time, times_fired)
var/mob/living/carbon/carbon_metabolizer = metabolizer
if(!istype(carbon_metabolizer) || !carbon_metabolizer.can_heartattack() || carbon_metabolizer.undergoing_cardiac_arrest())
metabolizer.reagents.del_reagent(type)
return
if(DT_PROB(10, delta_time))
carbon_metabolizer.set_heartattack(TRUE)

View File

@@ -147,9 +147,7 @@
for(var/i in 1 to 4 + rand(1,2))
var/chosen = getbork()
var/obj/item/food_item = new chosen(T)
if(istype(food_item, /obj/item/food))
var/obj/item/food/foody = food_item
foody.mark_silver_slime_reaction()
ADD_TRAIT(food_item, TRAIT_FOOD_SILVER, INNATE_TRAIT)
if(prob(5))//Fry it!
var/obj/item/food/deepfryholder/fried
fried = new(T, food_item)

View File

@@ -206,9 +206,9 @@
reagents.clear_reagents()
/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M)
/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/microwave_source, mob/microwaver)
reagents.expose_temperature(1000)
..()
return ..() | COMPONENT_MICROWAVE_SUCCESS
/obj/item/reagent_containers/fire_act(temperature, volume)
reagents.expose_temperature(temperature)

View File

@@ -613,7 +613,7 @@
/datum/status_effect/stabilized/darkpurple/tick()
var/obj/item/item = owner.get_active_held_item()
if(item)
if(IS_EDIBLE(item) && item.microwave_act())
if(IS_EDIBLE(item) && (item.microwave_act(microwaver = owner) & COMPONENT_MICROWAVE_SUCCESS))
to_chat(owner, span_warning("[linked_extract] flares up brightly, and your hands alone are enough cook [item]!"))
else
item.attackby(fire, owner)

View File

@@ -141,7 +141,7 @@ Burning extracts:
var/path = get_random_food()
var/obj/item/food/food = new path(pick(turfs))
food.reagents.add_reagent(/datum/reagent/toxin/slimejelly,5) //Oh god it burns
food.mark_silver_slime_reaction()
ADD_TRAIT(food, TRAIT_FOOD_SILVER, INNATE_TRAIT)
if(prob(50))
food.desc += " It smells strange..."
user.visible_message(span_danger("[src] produces a few pieces of food!"))

View File

@@ -120,9 +120,7 @@ Industrial extracts:
..()
/obj/item/slimecross/industrial/silver/do_after_spawn(obj/item/spawned)
if(istype(spawned, /obj/item/food))
var/obj/item/food/food_object = spawned
food_object.mark_silver_slime_reaction()
ADD_TRAIT(spawned, TRAIT_FOOD_SILVER, INNATE_TRAIT)
/obj/item/slimecross/industrial/bluespace
colour = "bluespace"

View File

@@ -156,7 +156,7 @@
if(SLIME_ACTIVATE_MINOR)
var/food_type = get_random_food()
var/obj/item/food/food_item = new food_type
food_item.mark_silver_slime_reaction()
ADD_TRAIT(food_item, TRAIT_FOOD_SILVER, INNATE_TRAIT)
if(!user.put_in_active_hand(food_item))
food_item.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, TRUE)

View File

@@ -19,6 +19,7 @@
/obj/item/kitchen/rollingpin = 2,
/obj/item/knife/kitchen = 2,
/obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2,
/obj/item/skillchip/chefs_kiss = 2,
/obj/item/plate/small = 5,
/obj/item/plate = 10,
/obj/item/plate/large = 5,

View File

@@ -1096,6 +1096,8 @@
#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\grilled_item.dm"
#include "code\datums\elements\food\microwavable.dm"
#include "code\datums\elements\food\processable.dm"
#include "code\datums\elements\food\venue_price.dm"
#include "code\datums\elements\screentips\contextual_screentip_bare_hands.dm"