diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 8b77b80b769..9a830e17773 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -14,6 +14,16 @@
/mob/living/attackby(obj/item/I, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
+
+ if((butcher_results) && (stat == DEAD))
+ var/sharpness = is_sharp(I)
+ if(sharpness)
+ user << "You begin to butcher [src]..."
+ playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
+ if(do_mob(user, src, 80/sharpness))
+ harvest(user)
+ return
+
if(istype(I) && ismob(user))
I.attack(src, user)
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index 0d0870d375a..576e87f3741 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -32,6 +32,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
AIStatus = AI_OFF
+ butcher_results = list(/obj/item/weapon/ectoplasm = 1)
var/summoned = FALSE
var/cooldown = 0
var/damage_transfer = 1 //how much damage from each attack we transfer to the owner
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index 378ef84990a..e1a2b90b3e1 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -38,7 +38,7 @@
wander = 0
attacktext = "glomps"
attack_sound = 'sound/effects/blobattack.ogg'
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2)
var/morphed = 0
var/atom/movable/form = null
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index cb658ff937d..a9aefdd7d0b 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -245,9 +245,12 @@
new_meat.name = "[slab_name] [new_meat.name]"
new_meat.reagents.add_reagent("nutriment",slab_nutrition)
+
if(occupant.reagents)
occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count,1))
+ if(occupant.get_species() == "Human")
+ new /obj/item/stack/sheet/animalhide/human
new /obj/effect/decal/cleanable/blood/gibs(src)
if(!UserOverride)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index b1659d8f2f2..a7e3a1a6732 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -5,6 +5,22 @@
icon_state = "sheet-hide"
origin_tech = ""
+var/global/list/datum/stack_recipe/human_recipes = list( \
+ new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/bloated_human, 5, on_floor = 1), \
+ new/datum/stack_recipe("bloated human costume head", /obj/item/clothing/head/human_head, 5, on_floor = 1), \
+ )
+
+/obj/item/stack/sheet/animalhide/human/New(var/loc, var/amount=null)
+ recipes = human_recipes
+ return ..()
+
+/obj/item/stack/sheet/animalhide/generic
+ name = "generic skin"
+ desc = "A piece of generic skin."
+ singular_name = "generic skin piece"
+ icon_state = "sheet-hide"
+ origin_tech = null
+
/obj/item/stack/sheet/animalhide/corgi
name = "corgi hide"
desc = "The by-product of corgi farming."
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 11db68ec671..32453576ef7 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -51,6 +51,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
null, \
new/datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index e865805991b..7e1ef361a32 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -1,5 +1,33 @@
+
//////Kitchen Spike
+/obj/structure/kitchenspike_frame
+ name = "meatspike frame"
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "spikeframe"
+ desc = "The frame of a meat spike."
+ density = 1
+ anchored = 0
+
+/obj/structure/kitchenspike_frame/attackby(obj/item/I, mob/user, params)
+ add_fingerprint(user)
+ if(istype(I, /obj/item/weapon/wrench))
+ if(anchored)
+ user << "You unwrench [src] from the floor."
+ anchored = 0
+ else
+ user << "You wrench [src] into place."
+ anchored = 1
+ else if(istype(I, /obj/item/stack/rods))
+ var/obj/item/stack/rods/R = I
+ if(R.get_amount() >= 4)
+ R.use(4)
+ user << "You add spikes to the frame."
+ new /obj/structure/kitchenspike(src.loc,)
+ add_fingerprint(user)
+ qdel(src)
+
+
/obj/structure/kitchenspike
name = "a meat spike"
icon = 'icons/obj/kitchen.dmi'
@@ -7,54 +35,104 @@
desc = "A spike for collecting meat from animals."
density = 1
anchored = 1
- var/meat = 0
- var/occupied
- var/meat_type
- var/victim_name = "corpse"
+ buckle_lying = 0
+ can_buckle = 1
+
+
/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
+ if(istype(G, /obj/item/weapon/crowbar))
+ if(!src.buckled_mob)
+ playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
+ if(do_after(user, 20, target = src))
+ user << "You pry the spikes out of the frame."
+ new /obj/item/stack/rods(loc, 4)
+ new /obj/structure/kitchenspike_frame(src.loc,)
+ add_fingerprint(user)
+ qdel(src)
+ else
+ user << "You can't do that while something's on the spike!"
+ return
if(!istype(G, /obj/item/weapon/grab) || !G.affecting)
return
- if(occupied)
+ if(buckled_mob)
user << "The spike already has something on it, finish collecting its meat first!"
else
- if(spike(G.affecting))
- visible_message("[user] has forced [G.affecting] onto the spike, killing them instantly!")
- qdel(G.affecting)
- qdel(G)
- else
- user << "They are too big for the spike, try something smaller!"
+ if(istype(G.affecting, /mob/living/))
+ if(!buckled_mob)
+ if(do_mob(src, src, 120))
+ if(spike(G.affecting))
+ qdel(G)
+ user << "You can't use that on the spike!"
+ return
/obj/structure/kitchenspike/proc/spike(var/mob/living/victim)
if(!istype(victim))
return
- if(istype(victim, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = victim
- if(!H.species.is_small)
- return 0
- meat_type = H.species.meat_type
- icon_state = "spikebloody"
- else if(istype(victim, /mob/living/carbon/alien))
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
- icon_state = "spikebloodygreen"
- else
- return 0
- victim_name = victim.name
- occupied = 1
- meat = 5
+ if(buckled_mob) //to prevent spam/queing up attacks
+ return 0
+ if(victim.buckled)
+ return 0
+ var/mob/living/H = victim
+ playsound(src.loc, "sound/effects/splat.ogg", 25, 1)
+ H.visible_message("[src] slams [victim] onto the meat spike!", "[src] slams you onto the meat spike!", "You hear a squishy wet noise.")
+ H.loc = src.loc
+ H.emote("scream")
+ if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere
+ var/turf/simulated/pos = get_turf(H)
+ pos.add_blood_floor(H)
+ H.adjustBruteLoss(30)
+ H.buckled = src
+ H.dir = 2
+ buckled_mob = H
+ var/matrix/m180 = matrix()
+ m180.Turn(180)
+ animate(H, transform = m180, time = 3)
+ H.pixel_y = H.get_standard_pixel_y_offset(180)
return 1
-/obj/structure/kitchenspike/attack_hand(mob/user as mob)
- if(..() || !occupied)
- return
- meat--
- new meat_type(get_turf(src))
- if(src.meat > 1)
- user << "You remove some meat from \the [victim_name]."
- else if(src.meat == 1)
- user << "You remove the last piece of meat from \the [victim_name]!"
- icon_state = "spike"
- occupied = 0
+
+
+/obj/structure/kitchenspike/user_buckle_mob(mob/living/M, mob/living/user) //Don't want them getting put on the rack other than by spiking
+ return
+
+/obj/structure/kitchenspike/user_unbuckle_mob(mob/living/carbon/human/user)
+ if(buckled_mob && buckled_mob.buckled == src)
+ var/mob/living/M = buckled_mob
+ if(M != user)
+ M.visible_message(\
+ "[user.name] tries to pull [M.name] free of the [src]!",\
+ "[user.name] is trying to pull you off of [src], opening up fresh wounds!",\
+ "You hear a squishy wet noise.")
+ if(!do_after(user, 300, target = src))
+ if(M && M.buckled)
+ M.visible_message(\
+ "[user.name] fails to free [M.name]!",\
+ "[user.name] fails to pull you off of [src].")
+ return
+
+ else
+ M.visible_message(\
+ "[M.name] struggles to break free from the [src]!",\
+ "You struggle to break free from the [src], exacerbating your wounds! (Stay still for two minutes.)",\
+ "You hear a wet squishing noise..")
+ M.adjustBruteLoss(30)
+ if(!do_after(M, 1200, target = src))
+ if(M && M.buckled)
+ M << "You fail to free yourself!"
+ return
+ if(!M.buckled)
+ return
+ var/matrix/m180 = matrix(M.transform)
+ m180.Turn(180)
+ animate(M, transform = m180, time = 3)
+ M.pixel_y = M.get_standard_pixel_y_offset(180)
+ M.adjustBruteLoss(30)
+ src.visible_message(text("[M] falls free of the [src]!"))
+ unbuckle_mob()
+ M.emote("scream")
+ M.AdjustWeakened(10)
+
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 8738104fcac..85dae45750b 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -224,6 +224,21 @@
item_state = "ponchoshame"
flags = NODROP
+/obj/item/clothing/suit/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!?
+ name = "bloated human suit"
+ desc = "A horribly bloated suit made from human skins."
+ icon_state = "lingspacesuit"
+ item_state = "lingspacesuit"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
+/obj/item/clothing/head/human_head
+ name = "bloated human head"
+ desc = "A horribly bloated and mismatched human head."
+ icon_state = "lingspacehelmet"
+ item_state = "lingspacehelmet"
+ body_parts_covered = HEAD
+
+
/*
* Misc
*/
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index f04f0567eba..b399bb21731 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -2,6 +2,7 @@
name = "alien"
icon_state = "alien_s"
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/xenomeat = 5, /obj/item/stack/sheet/animalhide/xeno = 1)
var/obj/item/weapon/r_store = null
var/obj/item/weapon/l_store = null
var/caste = ""
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
index 5f9828f1b45..cebcb1361b6 100644
--- a/code/modules/mob/living/carbon/human/species/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -15,6 +15,7 @@
is_small = 1
has_fine_manipulation = 0
ventcrawler = 1
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
show_ssd = 0
eyes = "blank_eyes"
death_message = "lets out a faint chimper as it collapses and stops moving..."
@@ -29,7 +30,6 @@
//unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws)
//inherent_verbs = list(/mob/living/proc/ventcrawl)
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
total_health = 75
brute_mod = 1.5
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index a003434c1a3..10bab983600 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -78,8 +78,7 @@
var/blood_color = "#A10808" //Red.
var/flesh_color = "#FFC896" //Pink.
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
- var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
-
+ var/list/butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/human = 1)
var/base_color //Used when setting species.
//Used in icon caching.
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index efe21341a66..52e6ea759c3 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -952,4 +952,15 @@
//used in datum/reagents/reaction() proc
/mob/living/proc/get_permeability_protection()
- return 0
\ No newline at end of file
+ return 0
+
+/mob/living/proc/harvest(mob/living/user)
+ //if(qdeleted(src))
+ // return//Replace with what?
+ if(butcher_results)
+ for(var/path in butcher_results)
+ for(var/i = 1; i <= butcher_results[path];i++)
+ new path(src.loc)
+ butcher_results.Remove(path) //In case you want to have things like simple_animals drop their butcher results on gib, so it won't double up below.
+ visible_message("[user] butchers [src].")
+ gib()
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index fa5c43ab8e1..ce73ae369c0 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -52,4 +52,6 @@
var/list/datum/action/actions = list()
var/step_count = 0
+ var/list/butcher_results = null
+
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
index a6c5effdde3..a2a25da11c1 100644
--- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm
+++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm
@@ -17,8 +17,7 @@
density = 0
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
ventcrawler = 2
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 0
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
/mob/living/simple_animal/butterfly/New()
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 950d47a7d69..b2a0c129b29 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -16,8 +16,7 @@
see_in_dark = 6
simplespecies = /mob/living/simple_animal/pet/cat
childtype = /mob/living/simple_animal/pet/cat/kitten
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 2b53e124796..6d09809fe2c 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -15,8 +15,7 @@
emote_see = list("shakes its head", "shivers")
speak_chance = 1
turns_per_move = 10
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/corgi = 3)
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 27ead7947e1..524cffc9979 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -11,8 +11,7 @@
emote_see = list("clacks")
speak_chance = 1
turns_per_move = 5
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "stomps the"
diff --git a/code/modules/mob/living/simple_animal/friendly/deer.dm b/code/modules/mob/living/simple_animal/friendly/deer.dm
index 68f168188b4..0cc59c07f94 100644
--- a/code/modules/mob/living/simple_animal/friendly/deer.dm
+++ b/code/modules/mob/living/simple_animal/friendly/deer.dm
@@ -10,8 +10,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 0 //I'm so funny
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 4)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index d7b76725db8..f3e77854882 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -12,8 +12,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 4
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 4)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -103,8 +102,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 6
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -168,8 +166,7 @@
density = 0
speak_chance = 2
turns_per_move = 2
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 1
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -211,8 +208,7 @@ var/global/chicken_count = 0
density = 0
speak_chance = 2
turns_per_move = 3
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 2
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 2)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -294,8 +290,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/ham
- meat_amount = 6
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/ham = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -316,8 +311,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat //enough to make one turkey
- meat_amount = 4
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 4)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -338,8 +332,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 6
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -360,8 +353,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 6
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
@@ -382,8 +374,7 @@ var/global/chicken_count = 0
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 6
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 6)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm
index f34ae89ef22..cd62ababfe7 100644
--- a/code/modules/mob/living/simple_animal/friendly/fox.dm
+++ b/code/modules/mob/living/simple_animal/friendly/fox.dm
@@ -13,8 +13,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "kicks"
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 74bc6839ba1..27cb2eb17cf 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -20,6 +20,5 @@
density = 0
pass_flags = PASSTABLE | PASSMOB
can_hide = 1
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 1
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
can_collar = 1
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 03fbb30ed06..b5065fb3f19 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -15,8 +15,7 @@
see_in_dark = 6
maxHealth = 5
health = 5
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 1
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "stamps on the"
diff --git a/code/modules/mob/living/simple_animal/friendly/pug.dm b/code/modules/mob/living/simple_animal/friendly/pug.dm
index a819602719a..03dd45d5036 100644
--- a/code/modules/mob/living/simple_animal/friendly/pug.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pug.dm
@@ -12,8 +12,7 @@
emote_see = list("shakes its head.", "chases its tail.","shivers.")
speak_chance = 1
turns_per_move = 10
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/pug
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/pug = 3)
response_help = "pets"
response_disarm = "bops"
response_harm = "kicks"
diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm
index 0ee27da03c1..39efa5227b5 100644
--- a/code/modules/mob/living/simple_animal/friendly/tomato.dm
+++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm
@@ -8,8 +8,7 @@
turns_per_move = 5
maxHealth = 15
health = 15
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/tomatomeat = 2)
response_help = "prods the"
response_disarm = "pushes aside the"
response_harm = "smacks the"
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 336bc7f9906..f21699e544f 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -10,8 +10,7 @@
response_disarm = "shoves the"
response_harm = "hits the"
speed = 0
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/xenomeat = 3)
maxHealth = 100
health = 100
harm_intent_damage = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm
index 0c2174d131e..0d0a46e3053 100644
--- a/code/modules/mob/living/simple_animal/hostile/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bat.dm
@@ -8,8 +8,7 @@
icon_gib = "bat_dead"
speak_chance = 0
turns_per_move = 3
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 1
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 9c6f24bd4ac..dc764c317da 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -13,8 +13,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
- meat_amount = 5
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/bearmeat = 5, /obj/item/clothing/head/bearpelt = 1)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 650f19cb758..9c3020e4839 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -9,8 +9,7 @@
icon_gib = "carp_gib"
speak_chance = 0
turns_per_move = 5
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
- meat_amount = 2
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 2)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index 2bd6a611b24..9de16829259 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -33,8 +33,7 @@
speak_chance = 5
turns_per_move = 5
see_in_dark = 10
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidermeat
- meat_amount = 2
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/spidermeat = 2, /obj/item/weapon/reagent_containers/food/snacks/spiderleg = 8)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
@@ -57,8 +56,8 @@
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidereggs
- meat_amount = 4
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/spidermeat = 2, /obj/item/weapon/reagent_containers/food/snacks/spiderleg = 8, /obj/item/weapon/reagent_containers/food/snacks/spidereggs = 4)
+
maxHealth = 40
health = 40
melee_damage_lower = 5
@@ -95,19 +94,6 @@
stop_automated_movement = 0
walk(src,0)
-// Chops off each leg with a 50/50 chance of harvesting one, until finally calling
-// default harvest action
-/mob/living/simple_animal/hostile/poison/giant_spider/harvest()
- if(butcher_state > 0)
- butcher_state--
- icon_state = icon_dead + "[butcher_state]"
-
- if(prob(50))
- new /obj/item/weapon/reagent_containers/food/snacks/spiderleg(src.loc)
- return
- else
- return ..()
-
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/GiveUp(var/C)
spawn(100)
if(busy == MOVING_TO_TARGET)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
index 7f705297dbd..6404ab29f21 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle_animals.dm
@@ -13,8 +13,7 @@
icon_gib = "panther_dead"
speak_chance = 0
turns_per_move = 3
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
@@ -72,8 +71,7 @@
icon_gib = "snake_dead"
speak_chance = 0
turns_per_move = 1
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 2
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 2)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 8559bd9d3d6..0555ae10ef7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -8,7 +8,7 @@
turns_per_move = 1
maxHealth = 10
health = 10
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice = 1)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "whacks"
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
index 65964739a32..b8eb3a96459 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
@@ -8,8 +8,7 @@
icon_gib = "carp_gib"
speak_chance = 0
turns_per_move = 5
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
- meat_amount = 1
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/carpmeat = 1)
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
index 8ca70430d44..4606a5157ee 100644
--- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
@@ -66,8 +66,7 @@
icon_state = "reindeer"
icon_living = "reindeer"
icon_dead = "reindeer-dead"
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3)
melee_damage_lower = 5
melee_damage_upper = 10
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 1732caa55f3..1e917b54ad1 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -43,8 +43,7 @@
speak_chance = 1//1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s
turns_per_move = 5
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker/
- meat_amount = 3
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 3)
response_help = "pets the"
response_disarm = "gently moves aside the"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 3a6333a3d00..da0c58a4d80 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -23,8 +23,6 @@
var/turns_per_move = 1
var/turns_since_move = 0
universal_speak = 0
- var/meat_amount = 0
- var/meat_type
var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals.
var/wander = 1 // Does the mob wander around when idle?
var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it.
@@ -273,9 +271,10 @@
/mob/living/simple_animal/gib()
if(icon_gib)
flick(icon_gib, src)
- if(meat_amount && meat_type)
- for(var/i = 0; i < meat_amount; i++)
- new meat_type(src.loc)
+ if(butcher_results)
+ for(var/path in butcher_results)
+ for(var/i = 1; i <= butcher_results[path];i++)
+ new path(src.loc)
..()
@@ -448,9 +447,6 @@
name = C.tagname
real_name = C.tagname
return
- else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
- if(istype(O, /obj/item/weapon/kitchen/knife))
- harvest()
else
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
@@ -611,12 +607,6 @@
if(alone && partner && children < 3)
new childtype(loc)
-
-// Harvest an animal's delicious byproducts
-/mob/living/simple_animal/proc/harvest()
- gib()
- return
-
/mob/living/simple_animal/say_quote(var/message)
var/verb = "says"
diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm
index 3f082c020db..7e0f0071fe7 100644
--- a/code/modules/mob/living/simple_animal/tribbles.dm
+++ b/code/modules/mob/living/simple_animal/tribbles.dm
@@ -16,8 +16,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
turns_per_move = 5
maxHealth = 10
health = 10
- meat_type = /obj/item/stack/sheet/fur
- meat_amount = 1
+ butcher_results = list(/obj/item/stack/sheet/fur = 1)
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "whacks"
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index de442968c0a..38ce685a266 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 0066bfd654f..cd6ae3095a0 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 328cc04d001..bf752f1ca21 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ