From 3b351c86367b3bef9e292fbe2f0e7d278b75d11c Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Tue, 21 May 2024 17:29:40 -0700 Subject: [PATCH] Nanotrasen Chefs have now officially gone to Chef College (#25066) * chef buff * comments and crap * blam * revert * s34n review * last review * Reduced expert chef cooldown to 5s. * Renamed things for clarity. * Moved Expert Chef Knowledge to IC * Don't use a Oven, use an Oven. * Made kitchen machines less egotistical. * Gave Expert Chef Knowledge a spell. * Apply suggestions from code review Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Less demanding background. * Removed verb decoration and STATUS_USED_EXPERT_CHEF * Apply suggestions from code review Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: GDN <96800819+GDNgit@users.noreply.github.com> * Changed trait name. * Lint * Apply review comment. * Remove master-removed panel var * Update code/modules/mob/living/carbon/human/human_mob.dm Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --------- Signed-off-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> Co-authored-by: FunnyMan3595 (Charlie Nolan) Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Co-authored-by: GDN <96800819+GDNgit@users.noreply.github.com> --- code/__DEFINES/crafting.dm | 8 +-- code/__DEFINES/misc_defines.dm | 4 ++ code/__HELPERS/trait_helpers.dm | 1 + code/__HELPERS/unsorted.dm | 15 ++++ code/_globalvars/traits.dm | 4 +- code/datums/recipe.dm | 68 +++++++++++++++--- code/datums/spells/chef.dm | 17 +++++ code/game/jobs/job/support.dm | 4 +- code/game/objects/items/trash.dm | 3 +- .../food_and_drinks/food/foods/misc_food.dm | 1 + .../kitchen_machinery/kitchen_machine.dm | 13 ++++ .../mob/living/carbon/human/human_mob.dm | 64 +++++++++++++++++ icons/mob/actions/actions.dmi | Bin 145937 -> 146116 bytes paradise.dme | 1 + 14 files changed, 184 insertions(+), 19 deletions(-) create mode 100644 code/datums/spells/chef.dm diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index 09b35c5d093..5d2cc6632e9 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -27,9 +27,9 @@ #define CAT_SPAGHETTI "Spaghettis" #define CAT_ICE "Frozen" -#define RECIPE_MICROWAVE "Microwave" -#define RECIPE_OVEN "Oven" -#define RECIPE_GRILL "Grill" -#define RECIPE_CANDY "Candy" +#define RECIPE_MICROWAVE "microwave" +#define RECIPE_OVEN "oven" +#define RECIPE_GRILL "grill" +#define RECIPE_CANDY "candy machine" #define RECIPE_FAIL null diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm index a837dc7a72b..790c9f9ea66 100644 --- a/code/__DEFINES/misc_defines.dm +++ b/code/__DEFINES/misc_defines.dm @@ -703,3 +703,7 @@ do { \ /// A helper used by `restrict_file_types.py` to identify types to restrict in a file. Not used by byond at all. #define RESTRICT_TYPE(type) // do nothing + +#define INGREDIENT_CHECK_EXACT 1 +#define INGREDIENT_CHECK_FAILURE 0 +#define INGREDIENT_CHECK_SURPLUS -1 diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm index 3cb5928179a..e3778abe37f 100644 --- a/code/__HELPERS/trait_helpers.dm +++ b/code/__HELPERS/trait_helpers.dm @@ -233,6 +233,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TABLE_LEAP "table_leap" // Lets bartender and chef mount tables faster #define TRAIT_NEVER_MISSES_DISPOSALS "trait_never_misses_disposals" // For janitors landing disposal throws #define TRAIT_SLEIGHT_OF_HAND "sleight_of_hand" +#define TRAIT_KNOWS_COOKING_RECIPES "knows_cooking_recipes" //***** ITEM AND MOB TRAITS *****// /// Show what machine/door wires do when held. diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 79d3208719c..ca7ef0c3adc 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -2082,3 +2082,18 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /proc/is_color_dark(color, threshold = 25) var/hsl = rgb2num(color, COLORSPACE_HSL) return hsl[3] < threshold + +/** + * This proc takes a list of types, and returns them in the format below. + * [type] = amount of type in list. + * Useful for recipes. + */ +/proc/type_list_to_counted_assoc_list(list/origin_list) + var/list/return_list = list() + for(var/datum/path as anything in origin_list) + if(isdatum(path)) + path = path.type + if(!return_list[path]) + return_list[path] = 0 + return_list[path] += 1 + return return_list diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 2e1fc13f5db..3d3cf117030 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -81,7 +81,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NOSELFIGNITION_HEAD_ONLY" = TRAIT_NOSELFIGNITION_HEAD_ONLY, "TRAIT_CONTORTED_BODY" = TRAIT_CONTORTED_BODY, "TRAIT_DEFLECTS_PROJECTILES" = TRAIT_DEFLECTS_PROJECTILES, - "TRAIT_TABLE_LEAP" = TRAIT_TABLE_LEAP, "TRAIT_DODGE_ALL_THROWN_OBJECTS" = TRAIT_DODGE_ALL_OBJECTS, "TRAIT_SUPERMATTER_IMMUNE" = TRAIT_SUPERMATTER_IMMUNE, "TRAIT_BADASS" = TRAIT_BADASS, @@ -98,7 +97,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HOLY" = TRAIT_HOLY, "TRAIT_SLEIGHT_OF_HAND" = TRAIT_SLEIGHT_OF_HAND, "TRAIT_TABLE_LEAP" = TRAIT_TABLE_LEAP, - "TRAIT_NEVER_MISSES_DISPOSALS" = TRAIT_NEVER_MISSES_DISPOSALS + "TRAIT_NEVER_MISSES_DISPOSALS" = TRAIT_NEVER_MISSES_DISPOSALS, + "TRAIT_KNOWS_COOKING_RECIPES" = TRAIT_KNOWS_COOKING_RECIPES ), /obj = list( diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 8d0f7a7c0a1..f10e70ed027 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -42,26 +42,49 @@ var/duplicate = TRUE var/byproduct // example: = /obj/item/kitchen/mould // byproduct to return, such as a mould or trash -/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous - . = 1 +/datum/recipe/proc/check_reagents(datum/reagents/avail_reagents) + . = INGREDIENT_CHECK_EXACT for(var/r_r in reagents) var/aval_r_amnt = avail_reagents.get_reagent_amount(r_r) if(!(abs(aval_r_amnt - reagents[r_r])<0.5)) //if NOT equals if(aval_r_amnt>reagents[r_r]) - . = -1 + . = INGREDIENT_CHECK_SURPLUS else - return 0 - if((reagents?(length(reagents)):(0)) < length(avail_reagents.reagent_list)) - return -1 + return INGREDIENT_CHECK_FAILURE + if((reagents ? length(reagents) : 0) < length(avail_reagents.reagent_list)) + return INGREDIENT_CHECK_SURPLUS + +/** + * Similarly to the function above, this checks for reagents, except instead of being passed a reagent holder, we're passed + * [reagent_id] = amount as num. + * Returns INGREDIENT_CHECK_EXACT if we have the precise amount thats requested. + * Returns INGREDIENT_CHECK_FAILURE if we do not have enough. + * Returns INGREDIENT_CHECK_SURPLUS if we have MORE than requested. + */ +/datum/recipe/proc/check_reagents_assoc_list(list/avail_reagents) + . = INGREDIENT_CHECK_EXACT + for(var/required_reagent_id in reagents) + var/provided_reagent_amount = avail_reagents[required_reagent_id] + if(!provided_reagent_amount) + return INGREDIENT_CHECK_FAILURE + + if(abs(provided_reagent_amount - reagents[required_reagent_id]) >= 0.5) // If amount is outside of the 0.5 unit tolerance + if(provided_reagent_amount > reagents[required_reagent_id]) // we have more than necessary + . = INGREDIENT_CHECK_SURPLUS + else + return INGREDIENT_CHECK_FAILURE // we don't have enough + + if(length(reagents) < length(avail_reagents)) + return INGREDIENT_CHECK_SURPLUS /datum/recipe/proc/check_items(obj/container, list/ignored_items = null) //1=precisely, 0=insufficiently, -1=superfluous - . = 1 + . = INGREDIENT_CHECK_EXACT var/list/checklist = items ? items.Copy() : list() for(var/obj/O in container) if(ignored_items && is_type_in_list(O, ignored_items)) //skip if this is something we are ignoring continue if(!items) - return -1 + return INGREDIENT_CHECK_SURPLUS var/found = 0 for(var/type in checklist) if(istype(O,type)) @@ -69,9 +92,32 @@ found = 1 break if(!found) - . = -1 + . = INGREDIENT_CHECK_SURPLUS if(length(checklist)) - return 0 + return INGREDIENT_CHECK_FAILURE + +/** + * Similarly to the function above, this checks for items, except instead of being passed a reagent holder, we're passed + * [type_path] = amount as num. + * Returns INGREDIENT_CHECK_EXACT if we have the precise amount thats requested. + * Returns INGREDIENT_CHECK_FAILURE if we do not have enough. + * Returns INGREDIENT_CHECK_SURPLUS if we have MORE than requested. + */ +/datum/recipe/proc/check_items_assoc_list(list/given_objects) + . = INGREDIENT_CHECK_EXACT + var/list/checklist = items ? items.Copy() : list() + for(var/obj/item/I as anything in given_objects) // path + var/amount_given = given_objects[I] + if(!length(checklist)) + return INGREDIENT_CHECK_SURPLUS + + for(var/i in 1 to amount_given) + if(I in checklist) + checklist -= I + else if(I in items) // make sure the recipe requires this item before declaring it surplus + . = INGREDIENT_CHECK_SURPLUS + if(length(checklist)) // we didnt get everything + return INGREDIENT_CHECK_FAILURE //general version /datum/recipe/proc/make(obj/container) @@ -94,7 +140,7 @@ container.reagents.clear_reagents() return result_obj -/proc/select_recipe(list/datum/recipe/available_recipes, obj/obj, exact = 1 as num, list/ignored_items = null) +/proc/select_recipe(list/datum/recipe/available_recipes, obj/obj, exact = INGREDIENT_CHECK_EXACT, list/ignored_items = null) if(!exact) exact = -1 var/list/datum/recipe/possible_recipes = new diff --git a/code/datums/spells/chef.dm b/code/datums/spells/chef.dm new file mode 100644 index 00000000000..642f5476f44 --- /dev/null +++ b/code/datums/spells/chef.dm @@ -0,0 +1,17 @@ +/datum/spell/chef/expert_chef + name = "Expert Chef Knowledge" + desc = "Find things you can cook with the items in reach." + school = "chef" + clothes_req = FALSE + base_cooldown = 5 SECONDS + human_req = TRUE + action_icon_state = "chef" + action_background_icon_state = "bg_default" + still_recharging_msg = "All this thinking makes your head hurt, wait a bit longer." + +/datum/spell/chef/expert_chef/cast(list/targets, mob/user = usr) + var/mob/living/carbon/human/H = targets[1] + H.expert_chef_knowledge() + +/datum/spell/chef/expert_chef/create_new_targeting() + return new /datum/spell_targeting/self diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index c8678be4e11..b24597ec1fa 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -244,7 +244,9 @@ var/datum/martial_art/cqc/under_siege/justacook = new justacook.teach(H) // requires mind ADD_TRAIT(H.mind, TRAIT_TABLE_LEAP, ROUNDSTART_TRAIT) - + ADD_TRAIT(H.mind, TRAIT_KNOWS_COOKING_RECIPES, ROUNDSTART_TRAIT) + if(H.mind) + H.mind.AddSpell(new /datum/spell/chef/expert_chef) /datum/job/hydro title = "Botanist" diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index e3e6b5d0b43..f9a3c96d3dd 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -38,8 +38,9 @@ icon_state = "twimsts" /obj/item/trash/popcorn - name = "Popcorn" + name = "popcorn" icon_state = "popcorn" + gender = PLURAL /obj/item/trash/sosjerky name = "Scaredy's Private Reserve Beef Jerky" diff --git a/code/modules/food_and_drinks/food/foods/misc_food.dm b/code/modules/food_and_drinks/food/foods/misc_food.dm index 7d5b6bcf6b0..ae9e946f60e 100644 --- a/code/modules/food_and_drinks/food/foods/misc_food.dm +++ b/code/modules/food_and_drinks/food/foods/misc_food.dm @@ -283,6 +283,7 @@ name = "popcorn" desc = "Now let's find some cinema." icon_state = "popcorn" + gender = PLURAL trash = /obj/item/trash/popcorn var/unpopped = 0 filling_color = "#FFFAD4" diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 2058df28982..09e60e96ff3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -440,6 +440,19 @@ if(dat) . += "It contains:
[dat]" + if(!HAS_MIND_TRAIT(user, TRAIT_KNOWS_COOKING_RECIPES)) + return + + if(locate(/obj/item/mixing_bowl) in contents) + . += "You can't see inside the mixing bowl, you're not sure what it would do." + return + + var/list/recipes = choose_recipes() + if(length(recipes) == 1 && recipes[1][2] != RECIPE_FAIL) + var/datum/recipe/recipe = recipes[1][2] + var/obj/item/result = recipe.result + . += "Your expert chef knowledge tells you that this would make \a [initial(result.name)]." + /obj/machinery/kitchen_machine/attack_hand(mob/user) if(stat & (BROKEN|NOPOWER) || panel_open || !anchored) return diff --git a/code/modules/mob/living/carbon/human/human_mob.dm b/code/modules/mob/living/carbon/human/human_mob.dm index eade62cabf0..dc78288d967 100644 --- a/code/modules/mob/living/carbon/human/human_mob.dm +++ b/code/modules/mob/living/carbon/human/human_mob.dm @@ -1967,3 +1967,67 @@ Eyes need to have significantly high darksight to shine unless the mob has the X set category = "IC" update_flavor_text() + +/mob/living/carbon/human/proc/expert_chef_knowledge() + if(!HAS_TRAIT(mind, TRAIT_KNOWS_COOKING_RECIPES)) + return + + var/list/possible_cookware = view(1, src) + + for(var/obj/item/storage/storage in possible_cookware) + possible_cookware += storage.contents + possible_cookware -= storage + + shuffle_inplace(possible_cookware) + + var/list/available_ingredients = list() + var/list/available_reagents = list() + for(var/obj/item/item in possible_cookware) + if(item.container_type == OPENCONTAINER && item.reagents) + for(var/datum/reagent/reagent in item.reagents.reagent_list) + if(!available_reagents[reagent.id]) + available_reagents[reagent.id] = 0 + available_reagents[reagent.id] += reagent.volume + else + if(!available_ingredients[item.type]) + available_ingredients[item.type] = 0 + available_ingredients[item.type] += 1 + + var/list/possible_recipes = list() + for(var/datum/recipe/recipe_type as anything in subtypesof(/datum/recipe)) + if(!recipe_type.result) + continue + var/datum/recipe/recipe = new recipe_type() + if(recipe.check_reagents_assoc_list(available_reagents) != INGREDIENT_CHECK_FAILURE && recipe.check_items_assoc_list(available_ingredients) != INGREDIENT_CHECK_FAILURE) + if(istype(recipe, /datum/recipe/microwave)) + possible_recipes[recipe] = RECIPE_MICROWAVE + else if(istype(recipe, /datum/recipe/oven)) + possible_recipes[recipe] = RECIPE_OVEN + else if(istype(recipe, /datum/recipe/grill)) + possible_recipes[recipe] = RECIPE_GRILL + else if(istype(recipe, /datum/recipe/candy)) + possible_recipes[recipe] = RECIPE_CANDY + else + possible_recipes[recipe] = "something? This shouldn't happen, make a bug report" + + if(!length(possible_recipes)) + to_chat(src, "You can't think of anything to cook with the items around you.") + return + + var/list/message = list("You draw upon your extensive experience in space food, contemplating what you could make with the items around you...") + for(var/datum/recipe/recipe in possible_recipes) + var/list/assoc = type_list_to_counted_assoc_list(recipe.items) + var/list/ingredient_list = list() + for(var/obj/item/path_key as anything in assoc) + ingredient_list += "[assoc[path_key]] [initial(path_key.name)]\s" + + var/list/required_reagents = list() + for(var/reagent_id in recipe.reagents) + var/datum/reagent/temp = GLOB.chemical_reagents_list[reagent_id] + if(temp) + required_reagents += "[recipe.reagents[reagent_id]] unit\s of [temp.name]" + + var/obj/item/result = recipe.result + message += "\tI could make [result.gender == PLURAL ? "some" : "a"] [bicon(result)] [result.name] by using \a [possible_recipes[recipe]] with [english_list(ingredient_list)][length(required_reagents) ? ", along with [english_list(required_reagents)]" : ""]." + qdel(recipe) + to_chat(src, chat_box_examine(message.Join("
"))) diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index e9b7ef94895c3102e3de6cb5c0c3739b6e7beb4c..ed1b9f9f312c2c21cddaa15f6c608d40bca7de1a 100644 GIT binary patch delta 2381 zcmV-T39|N)^a#ZD2#_QJGO;Bd2pk&hb%8E6sXy<&|M6}2?e`zo{|87REzQIeJ7a@d z2!~n-0k>KR0?r@;5rMZVDFXio5#S)y$jQkG_bE7V;J|@{>kyYZF#@80zoBiMcO1aK z*JUGZM6hqIo0KdUE4C$vs@n=-$q-oCh+fp`o4$|Rc#5fOZTu;Xjf-uy>-_p7hVoY7nZ0|D&Zxf2Ht8~^~^xN!py z9y|bW%l2y%5fN<#wgsRwZ@sPW@9Ba3Y&!rTcYhIYoP1M1J8EBbeY(Jjf{+J`p=k%h{!HY|F8YgD*=7~>&MaC+l`42CIJ8<4E6Trzs`FrgrG_lAUg~X z59`5Tuv~R8SGdKKXY@l0D!reD+Y@fdU^oldwpsldV{Ks`Tpc&T|q?zpOb32DQN3P zqfs4T5F#R?*4DHDB*IVo_htO|*T2WND=RpAaa;oO6`$Pw#k$4|hr>DmghHW`f22NN z`RU&Ac)aA;YU4DbnH8Xc{(k+4q9DDr1ZP`Y$*X4Z9;=OiIndv)*BXLSsg%A^@Dapu zqtU3&5JW^ot*R;C10=#vXU~3IoVkM!S5|OlE&Q0>z4vd_5`@CxurA9oWLY)>jNtS6 z^v=#sl=~?TM%Bi#;?-lv^~>9~Bl5rR;_|lb_`?_XjrS%VEE@Y?J$Ah2Ynj7Oc6k{W zv)PhYtICakm0ey&dT9wq6s2l~NJynpdS72(-Pb;;svABoBO)StTpF$bnJYhk|3|W7 z_=$fwg|nmYNN=2cv+6%Z5n6J&900)SbRrxM>!DCc65$5`-pynnubqy!vO$B2$E$P>2%r{Czs2?<#J(cY)rRW4QiKnV}5?A;CHi*j<$k;R4ZrO z`Z=P1;rZINPjT(qr|^2cR&Esl;PrZqae~2ML9jAkvldz^W%)jch=^K^Y-3bT3A>xjukx=Ph^S>*dIZ+Y@M9)I zkgBS>q9_0WRaNz9G%Agcj~4`%KPQv;mudTy$5SxY>C>mB;&EIq7i3w6RqgWbiWQ!r z@2vt$|H1Vyzri2>5~=I6aJID}yS$8n{(imqv6WrKHESh8P+wnP)et0(BO)SdWpxLC zAiKg30OWExXqpB^QIK70{`GpjP*v3kKMx;11OODb<#w*^7gSZ%y;hr|Z7Yc6m2k?q1{fj*hl`2zs!H z%iFf&^0w{B?0CAaY4AWk1T{M4y;fo>yp`}nL`1Yz)KmeoGyIr|5EKjs;q&=)&stwk zGMNOhUI9vHGI*(|=O>-Xz}eYMs_PcxO9`DJB#e5EPynM}s= zy_Gw+k>DeGe_U?2<$EF`B5DO22B1e3egGhw%_16&N+SG-;1dW05R1i(<6iQ3@Xut@ z2tmg7S|5<6X$9waJRTzinIEZHwQpbL^JizXb2L}gn?%X+JX^Y}O1fZY-R9p@6csz*3Vg=_94h|v`iRhY^@3Ik1(e>!)Xsa52 zfa>9>Rw4uigF#%ma>ZDG{avi_RjcmqZX7yv28Q7bE{0PXMT zF;;RHtGLg6{0Y9bvGN1Jcw`le#SjPt3fA?C$Kys-sJFKlGcz+dc<>-@-noq%y#YC)$}omh=`t41p(-HzxkE1 zR@dkG9Fz|~WtOgguuF0E#!T#wL?Sv++T>g5Jn^2nvD%99iN8vFcD<_uz@9@#QR#Jj z;zYxrm-#VRBbxE}i-?G5tC8aIc*#!lf~Ail{Fr-us)ZP{si`U5@Apf^+jd;bY|rd3 z^o<^Y-P!kE(>}9C7e;OM@Z@2WHS@E%S>h|s1@caEG+jhIN?>*_x z7XbF1K&97aYV`m^L`1Y1HMAQ1<1{ohB$eAHA|fK%$fgZIL_|bHR<%R`ipS$pGMO~K zu+XmSG}`||L_|beLrVl8U_Aucjp2ugh=~3V?#7Y8HXi?D00000NkvXXu0mjf7owY5 delta 2201 zcmV;K2xj-h^$3yl2#_QJEwLpY2p3+q_vhXBKfdk0{r=a0-}F^p>17v9KgS~%SPLX zU~9E&myB!4f9@QrZYzYDA(*mZJ=E#T7&2yv23#s?@?sgb!PrLDr#?)687c}1l$z32 zFLQ|v!=*$NrAiS=X;l(#lS&r$;^5Y@Y_f^YUGE;Gb943A`gh&L`hLLN>w9(1HTT6| ze&-yWhhk~menfxp`N7ez4OjE8^3GRZS7^~*lan4CJ9Z2wPMiP$+_-TAySuvpZkhgU zA|j&0z_b8#?v+=y!I2SIpXdevWWLtw3>QBDnbN}^y{Gb2fM~{C; zzfVL&L=P@g0+2EMJlS)9(@NJb-G?Fs0r@IWr3#Q)W@mqA^=jI!Tlq@QwQJX^er|q# z{-J-zL_|bpY5RZe_n-4L+!&3~QuVF*FhDnMqKot@RZUT?!~ z7=nn1h$?Gq0DAv9kM?8x<2YIfKWl5N0D!f%Rs3pl5=-wa~OS{{+a-=_h{q&S} zY3Z%Ho@ER_>75;qb z{xyH;#g|^L`DJ|~v}7_F0D#?Y*Tai3{Jfq@!CGjO0dU4^lYycrSX^Ax#IRVSx~=`#+{_mJZq(b`RTPlwW$(J*Mof6V ze*Gg{zy1-NPG>WJDgeOgbn5+hz22f=Wqc+P5mBdUIsnxhe(E8rKFMSfdwYBE`~82C z&*#&8KA-0I`=za|E&a11=u~37x3#rZ*3aJF9z>vOCIoF~HmX*AjA5uW80{yS%~riv zZMd%B0E;IMV4fLZOfp3WcO-GzwXkp(qMcsT2Spl}f=@nDi`ujQ12pfh^02Mx%N^ z>2w<7Gsgdnfi3zy5KIUEiEK%y|mM^#nWY&IlQDLhlSCnQrT*lm9{tgNg+Q52}E z3ejFHjThmkohq&TYG!$SwI%SPvek@AZ5e!sh=}S4KnE3m0O&(sBK(NpziTlSD!fLHc=N9+0Z4MQt1ohaQ5&#OPKG3{-Ewx|(iy6`0Zd{Jb*)gXt%fp9on)P8z;8o^*tQ`P*&5@J$xBYJzgYK9-6b~vh+ z2ti)27gw)d)pvgvdwkVvcz76NV`ErYVE7>-A~Gtg01b|e=sSP8i(TB~AAE>!OsxC> z(1)zT;V?WNPtm?!kw`?Z3XP7AA|8+9hTwUda@m_L^nJ zr~&1Ze5ly$Y9~(!toS!GD`(W@e;H z=R`zAMEgZ~Xaf)t5fM?d9*6)GiA1DCBB6g_p;^yqb^Z?#5fL2@4@3Y0?uQ_=G5in_ b5z+qvLhCu(>R3c}00000NkvXXu0mjf7_KIL diff --git a/paradise.dme b/paradise.dme index 8f0b4deab90..e307ba51e9b 100644 --- a/paradise.dme +++ b/paradise.dme @@ -555,6 +555,7 @@ #include "code\datums\spells\charge.dm" #include "code\datums\spells\charge_up.dm" #include "code\datums\spells\charge_up_bounce.dm" +#include "code\datums\spells\chef.dm" #include "code\datums\spells\cluwne.dm" #include "code\datums\spells\conjure.dm" #include "code\datums\spells\conjure_item.dm"