diff --git a/code/modules/food_and_drinks/food/foods/baked_goods.dm b/code/modules/food_and_drinks/food/foods/baked_goods.dm
index 1aedaf3f4c7..1115b42014e 100644
--- a/code/modules/food_and_drinks/food/foods/baked_goods.dm
+++ b/code/modules/food_and_drinks/food/foods/baked_goods.dm
@@ -345,7 +345,7 @@
/obj/item/reagent_containers/food/snacks/donut/sprinkles
name = "frosted donut"
icon_state = "donut2"
- list_reagents = list("nutriment" = 3, "sugar" = 2, "spinkles" = 2)
+ list_reagents = list("nutriment" = 3, "sugar" = 2, "sprinkles" = 2)
filling_color = "#FF69B4"
randomized_sprinkles = 0
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
index 8d91fd14258..9bfb1eb4260 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_table.dm
@@ -252,4 +252,12 @@
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Tai_maki
+ category = CAT_FOOD
+
+/datum/crafting_recipe/food/cak
+ name = "Living cat/cake hybrid"
+ reqs = list(
+ /obj/item/organ/internal/heart = 1,
+ )
+ result = /mob/living/simple_animal/pet/cat/cak
category = CAT_FOOD
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 309a13468a3..636df89885d 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -13,7 +13,7 @@
if(INTENT_HARM, INTENT_DISARM)
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
visible_message("[M] [response_harm] [src]!")
- playsound(loc, "punch", 25, 1, -1)
+ playsound(loc, attacked_sound, 25, 1, -1)
attack_threshold_check(harm_intent_damage)
add_attack_logs(M, src, "Melee attacked with fists")
updatehealth()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index e1d61c5aa55..676dbccc628 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -177,3 +177,94 @@
minbodytemp = 0
melee_damage_lower = 5
melee_damage_upper = 15
+
+/mob/living/simple_animal/pet/cat/cak
+ name = "Keeki"
+ desc = "It's a cat made out of cake. It looks like a brain would fit into its head."
+ icon_state = "cak"
+ icon_living = "cak"
+ icon_resting = "cak_rest"
+ icon_dead = "cak_dead"
+ health = 50
+ maxHealth = 50
+ harm_intent_damage = 10
+ butcher_results = list(
+ /obj/item/organ/internal/heart = 1,
+ /obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3,
+ /obj/item/reagent_containers/food/snacks/meat = 2
+ )
+ response_harm = "takes a bite out of"
+ attacked_sound = "sound/items/eatfood.ogg"
+ deathmessage = "loses its false life and collapses!"
+ death_sound = "bodyfall"
+ var/obj/item/organ/internal/brain/brain = null
+
+/mob/living/simple_animal/pet/cat/cak/Life()
+ ..()
+ if(stat)
+ return
+ if(health < maxHealth)
+ adjustBruteLoss(-4)
+ for(var/obj/item/reagent_containers/food/snacks/donut/D in range(1, src))
+ if(D.icon_state != "donut2")
+ D.name = "frosted donut"
+ D.icon_state = "donut2"
+ D.reagents.add_reagent("sprinkles", 2)
+ D.filling_color = "#FF69B4"
+
+/mob/living/simple_animal/pet/cat/cak/attackby(obj/item/O, mob/living/user, params)
+ if(istype(O, /obj/item/organ/internal/brain))
+ var/obj/item/organ/internal/brain/B = O
+ if(brain) //There's already a brain in it.
+ to_chat(user, "There's already a brain in [src]!")
+ return
+ if(!B.brainmob.key)
+ var/ghost_can_reenter = 0
+ if(B.brainmob.mind)
+ for(var/mob/dead/observer/G in GLOB.player_list)
+ if(G.can_reenter_corpse && G.mind == B.brainmob.mind)
+ ghost_can_reenter = 1
+ break
+ for(var/mob/living/simple_animal/S in GLOB.player_list)
+ if(S in GLOB.respawnable_list)
+ ghost_can_reenter = 1
+ break
+ if(!ghost_can_reenter)
+ to_chat(user, "[B] is completely unresponsive; there's no point.")
+ return
+
+ to_chat(user, "You install [B] in [src]!")
+
+ user.drop_item()
+ B.forceMove(src)
+ brain = B
+ transfer_personality(B)
+
+ return 1
+
+
+ if(istype(O, /obj/item/kitchen/knife))
+ to_chat(user, "You cut out the brain from [src].")
+ eject_brain()
+ return 1
+
+ else if(user.a_intent == INTENT_HARM && user.reagents)
+ user.reagents.add_reagent("nutriment", 0.4)
+ user.reagents.add_reagent("vitamin", 0.4)
+
+/mob/living/simple_animal/pet/cat/cak/proc/transfer_personality(obj/item/organ/internal/brain/B)
+ mind = B.brainmob.mind
+ mind.key = B.brainmob.key
+ ckey = B.brainmob.ckey
+ name = "Keeki"
+ desc = "It's a cat made out of cake. It looks like a real brain is in it's head."
+ rename_self("cake cat")
+
+/mob/living/simple_animal/pet/cat/cak/proc/eject_brain()
+ var/turf/T = get_turf(src)
+ brain.forceMove(T)
+ desc = "It's a cat made out of cake. It looks like a brain would fit into its head."
+ if(mind)
+ mind.transfer_to(brain.brainmob)
+ brain = null
+ name = "Keeki"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index a5e7bad699f..27e544e56d6 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -76,6 +76,7 @@
var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions
var/list/loot = list() //list of things spawned at mob's loc when it dies
var/del_on_death = 0 //causes mob to be deleted on death, useful for mobs that spawn lootable corpses
+ var/attacked_sound = "punch"
var/deathmessage = ""
var/death_sound = null //The sound played on death
diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi
index 4f46db21354..3c3cbddaf93 100644
Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ