[MIRROR] Chefs can now kiss food they make to make it with love. (And a lot of cooking refactoring) [MDB IGNORE] (#17334)

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

* update from master and fix conflicts

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
This commit is contained in:
SkyratBot
2022-11-09 17:49:35 +00:00
committed by GitHub
co-authored by MrMelbert Tom
parent 470ea238cb
commit 9e9b09d90b
62 changed files with 784 additions and 545 deletions
+45 -11
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)
+1 -19
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
+30 -3
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", \
@@ -74,14 +97,18 @@
#define FOOD_AMAZING 5
#define RACE_DRINK 6 // SKYRAT ADDITION
/// 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 (35 MINUTES) // SKYRAT EDIT - ORIGINAL: 15 MINUTES
#define FOOD_MEAT_NORMAL 5
#define FOOD_MEAT_HUMAN 50
#define FOOD_MEAT_MUTANT 100
+7
View File
@@ -476,6 +476,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"
@@ -541,7 +543,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
+24 -12
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
+139 -142
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)
+42 -45
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
/// What type of pollutant we spread around as we are grilleed, can be none // SKYRAT EDIT ADDITION
var/pollutant_type // SKYRAT EDIT ADDITION
@@ -30,8 +27,13 @@
src.use_large_steam_sprite = use_large_steam_sprite
src.pollutant_type = pollutant_type //SKYRAT EDIT ADDITION
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)
@@ -46,8 +48,21 @@
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
@@ -59,52 +74,34 @@
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
@@ -121,14 +118,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)
+31
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)
+69
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)].")
+5 -1
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
init_flags = MATERIAL_INIT_BESPOKE
+5 -2
View File
@@ -28,5 +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"))
@@ -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
+5 -3
View File
@@ -1514,7 +1514,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)
@@ -1526,8 +1525,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.
///
+5 -10
View File
@@ -952,11 +952,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
@@ -1574,11 +1574,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.
+3 -2
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
+5 -14
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 ..()
+11 -7
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."
+3 -1
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."
+2 -11
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)
+27 -13
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."
+2 -12
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)
+6 -2
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..."
+2 -13
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()
. = ..()
+33 -26
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"
+18 -29
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."
+3 -1
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."
+2 -12
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))
+11 -8
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."
+34
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)
@@ -371,6 +371,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"
@@ -291,6 +291,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)
@@ -301,11 +307,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."
-4
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
+1 -1
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)
+2 -2
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
+8 -6
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"
+2 -12
View File
@@ -87,18 +87,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()
+6 -3
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
@@ -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()
@@ -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))
@@ -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()
@@ -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//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE
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
@@ -128,7 +144,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
@@ -186,7 +202,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"
@@ -201,7 +217,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()
@@ -217,7 +233,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()
@@ -231,17 +247,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
@@ -273,7 +289,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
@@ -339,7 +355,7 @@
if("eject")
eject()
if("use")
cook()
cook(user)
if("examine")
examine(user)
@@ -351,10 +367,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)
@@ -365,14 +381,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."))
@@ -388,17 +409,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()
@@ -407,7 +424,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
@@ -415,15 +432,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()
. = ..()
@@ -431,39 +448,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
@@ -506,3 +529,10 @@
#undef MICROWAVE_NORMAL
#undef MICROWAVE_MUCK
#undef MICROWAVE_PRE
#undef NOT_BROKEN
#undef KINDA_BROKEN
#undef REALLY_BROKEN
#undef MAX_MICROWAVE_DIRTINESS
+11 -5
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
@@ -3,6 +3,9 @@
category = CAT_FOOD
time = 5 // Skyrat Change, default crafting time is 30 deciseconds, food is crafted much more often and in large numbers.
/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
@@ -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(
-13
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)
+2 -3
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)
+3 -1
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."
+2 -12
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.
+3 -1
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"
@@ -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)
@@ -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
+1 -1
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!")
@@ -1318,6 +1318,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
@@ -2823,3 +2823,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)
@@ -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)
+2 -2
View File
@@ -254,9 +254,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)
@@ -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)
@@ -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!"))
@@ -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"
@@ -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)
+1
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,
+2
View File
@@ -1168,6 +1168,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"