mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 09:42:29 +00:00
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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
31
code/datums/elements/food/grilled_item.dm
Normal file
31
code/datums/elements/food/grilled_item.dm
Normal 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
code/datums/elements/food/microwavable.dm
Normal file
69
code/datums/elements/food/microwavable.dm
Normal 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)].")
|
||||
@@ -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
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
///
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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..."
|
||||
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user