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