diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm
index 00ced214f81..eaa9fa95b6a 100644
--- a/code/datums/components/crafting/melee_weapon.dm
+++ b/code/datums/components/crafting/melee_weapon.dm
@@ -276,3 +276,77 @@
time = 5 SECONDS
category = CAT_WEAPON_MELEE
+// Crusher trophies
+/datum/crafting_recipe/crusher_trophy
+ abstract_type = /datum/crafting_recipe/crusher_trophy
+ tool_paths = list(/obj/item/kinetic_crusher)
+ time = 5 SECONDS
+ category = CAT_WEAPON_MELEE
+
+/datum/crafting_recipe/crusher_trophy/watcher_wing
+ name = "Watcher Wing Trophy"
+ result = /obj/item/crusher_trophy/watcher_wing
+ reqs = list(
+ /obj/item/stack/sheet/sinew = 7,
+ /obj/item/stack/ore/diamond = 10,
+ /obj/item/stack/sheet/bone = 5,
+ )
+
+/datum/crafting_recipe/crusher_trophy/icewing_watcher_wing
+ name = "Icewing Watcher Wing Trophy"
+ result = /obj/item/crusher_trophy/ice_wing
+ reqs = list(
+ /obj/item/stack/sheet/sinew/icewing = 3,
+ /obj/item/stack/ore/diamond = 6,
+ /obj/item/stack/sheet/bone = 3,
+ )
+
+/datum/crafting_recipe/crusher_trophy/magmawing_watcher_wing
+ name = "Magmawing Watcher Wing Trophy"
+ result = /obj/item/crusher_trophy/magma_wing
+ reqs = list(
+ /obj/item/stack/sheet/sinew/magmawing = 3,
+ /obj/item/stack/ore/diamond = 6,
+ /obj/item/stack/sheet/bone = 3,
+ )
+
+/datum/crafting_recipe/crusher_trophy/goliath_tentacle
+ name = "Goliath Tentacle Trophy"
+ result = /obj/item/crusher_trophy/goliath_tentacle
+ reqs = list(
+ /obj/item/stack/sheet/animalhide/goliath_hide = 3,
+ /obj/item/stack/sheet/bone = 8,
+ )
+
+/datum/crafting_recipe/crusher_trophy/legion_skull
+ name = "Legion Skull Trophy"
+ result = /obj/item/crusher_trophy/legion_skull
+ reqs = list(
+ /obj/item/organ/monster_core/regenerative_core/legion = 3, // Good sink for expired cores
+ /obj/item/stack/sheet/bone = 5,
+ )
+
+/datum/crafting_recipe/crusher_trophy/lobster_claw
+ name = "Lobster Claw Trophy"
+ result = /obj/item/crusher_trophy/lobster_claw
+ reqs = list(
+ /obj/item/organ/monster_core/rush_gland = 3,
+ /obj/item/stack/sheet/bone = 5,
+ /obj/item/food/meat/slab/rawcrab = 3,
+ )
+
+/datum/crafting_recipe/crusher_trophy/brimdemon_fang
+ name = "Brimdemon Fang Trophy"
+ result = /obj/item/crusher_trophy/brimdemon_fang
+ reqs = list(
+ /obj/item/organ/monster_core/brimdust_sac = 3,
+ /datum/reagent/brimdust = 45,
+ )
+
+/datum/crafting_recipe/crusher_trophy/bileworm_spewlet
+ name = "Bileworm Spewlet Trophy"
+ result = /obj/item/crusher_trophy/bileworm_spewlet
+ reqs = list(
+ /obj/item/stack/sheet/animalhide/bileworm = 3,
+ /obj/item/stack/ore/gold = 12,
+ )
diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm
index c41659c64a8..8406bfeeefa 100644
--- a/code/datums/components/crafting/tailoring.dm
+++ b/code/datums/components/crafting/tailoring.dm
@@ -360,9 +360,19 @@
time = 2 SECONDS
reqs = list(
/obj/item/stack/sheet/bone = 1,
- /obj/item/stack/sheet/sinew = 1,
+ /obj/item/stack/sheet/sinew/icewing = 3,
+ /obj/item/stack/ore/diamond = 2,
+ )
+ category = CAT_CLOTHING
+
+/datum/crafting_recipe/magmawing
+ name = "Magmawing Wreath"
+ result = /obj/item/clothing/neck/wreath/magmawing
+ time = 2 SECONDS
+ reqs = list(
+ /obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/sheet/sinew/magmawing = 3,
/obj/item/stack/ore/diamond = 2,
- /obj/item/crusher_trophy/watcher_wing/ice_wing = 1,
)
category = CAT_CLOTHING
diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm
index 08f36ff7036..a1136929cef 100644
--- a/code/datums/status_effects/debuffs/debuffs.dm
+++ b/code/datums/status_effects/debuffs/debuffs.dm
@@ -375,7 +375,7 @@
/datum/status_effect/crusher_mark
id = "crusher_mark"
- duration = 300 //if you leave for 30 seconds you lose the mark, deal with it
+ duration = 30 SECONDS //if you leave for 30 seconds you lose the mark, deal with it
status_type = STATUS_EFFECT_REFRESH
alert_type = null
/// The bubble that is added to the mob as a visual
@@ -384,10 +384,21 @@
var/boosted = FALSE
/// How long before the mark is ready to be detonated. Used for both the visual overlay and to determine when it's ready
var/ready_delay = 0.8 SECONDS
+ /// Damage dealt when the mark is detonated
+ var/detonation_damage = 50
+ /// PKC that set this mark, for PKC-independent bursts
+ var/obj/item/kinetic_crusher/crusher
-/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, was_boosted)
+/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, was_boosted, obj/item/kinetic_crusher/crusher)
. = ..()
boosted = was_boosted
+ src.crusher = crusher
+ if (crusher)
+ RegisterSignal(crusher, COMSIG_QDELETING, PROC_REF(on_crusher_destroyed))
+
+/datum/status_effect/crusher_mark/proc/on_crusher_destroyed(datum/source)
+ SIGNAL_HANDLER
+ crusher = null
/datum/status_effect/crusher_mark/on_apply()
if(owner.mob_size < MOB_SIZE_LARGE)
@@ -409,8 +420,42 @@
if(owner)
owner.underlays -= marked_underlay
QDEL_NULL(marked_underlay)
+ crusher = null
return ..()
+/datum/status_effect/crusher_mark/proc/detonate(obj/item/kinetic_crusher/used_crusher, mob/living/user, melee_hit = TRUE)
+ var/datum/status_effect/crusher_damage/crusher_damage_effect = owner.has_status_effect(/datum/status_effect/crusher_damage) || owner.apply_status_effect(/datum/status_effect/crusher_damage)
+ var/target_health = owner.health
+ var/combined_damage = detonation_damage
+ for(var/obj/item/crusher_trophy/crusher_trophy as anything in used_crusher?.trophies)
+ combined_damage += crusher_trophy.on_mark_detonation(owner, user, used_crusher)
+
+ // Trophy effects kill the target, abort
+ if(QDELETED(owner))
+ return
+
+ if(!QDELETED(crusher_damage_effect))
+ crusher_damage_effect.total_damage += target_health - owner.health // We did some damage, but let's not assume how much we did
+
+ new /obj/effect/temp_visual/kinetic_blast(get_turf(owner))
+ var/backstabbed = FALSE
+ var/def_check = owner.getarmor(type = BOMB)
+
+ // Backstab bonus, only if a crusher was used to detonate the mark
+ if(melee_hit && used_crusher && (boosted || (user && check_behind(user, owner) && !HAS_TRAIT(owner, TRAIT_BACKSTAB_IMMUNE))))
+ backstabbed = TRUE
+ combined_damage += used_crusher.backstab_bonus
+ playsound(user, used_crusher.backstab_sound, 100, TRUE)
+
+ if(!QDELETED(crusher_damage_effect))
+ crusher_damage_effect.total_damage += combined_damage
+
+ if (user)
+ SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, owner, used_crusher, backstabbed)
+ owner.apply_damage(combined_damage, BRUTE, blocked = def_check)
+ if (!QDELETED(owner))
+ owner.remove_status_effect(src)
+
// Object used to apply a underlay to the mob that gets this status applied
/obj/effect/abstract/crusher_mark
name = "Crusher mark underlay"
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index c2e769c7f55..0510d73bf49 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -286,26 +286,49 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \
drop_sound = 'sound/effects/meatslap.ogg'
pickup_sound = 'sound/effects/meatslap.ogg'
resistance_flags = FIRE_PROOF | LAVA_PROOF
+ /// Trophy crafting recipe for this type of sinew
+ var/trophy_type = /datum/crafting_recipe/crusher_trophy/watcher_wing
/obj/item/stack/sheet/sinew/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt)
. = ..()
-
// As bone and sinew have just a little too many recipes for this, we'll just split them up.
// Sinew slapcrafting will mostly-sinew recipes, and bones will have mostly-bones recipes.
- var/static/list/slapcraft_recipe_list = list(\
- /datum/crafting_recipe/goliathcloak, /datum/crafting_recipe/skilt, /datum/crafting_recipe/drakecloak,\
- )
-
+ var/list/slapcraft_recipe_list = list(
+ /datum/crafting_recipe/goliathcloak,
+ /datum/crafting_recipe/skilt,
+ /datum/crafting_recipe/drakecloak,
+ )
+ if (trophy_type)
+ slapcraft_recipe_list += trophy_type
AddElement(
/datum/element/slapcrafting,\
- slapcraft_recipes = slapcraft_recipe_list,\
+ slapcraft_recipes = string_list(slapcraft_recipe_list),\
)
+/obj/item/stack/sheet/sinew/icewing
+ name = "icewing watcher sinew"
+ desc = "Ice-cold filaments which presumably came from an icewing watcher's wings."
+ singular_name = "icewing watcher sinew"
+ icon_state = "sinew_icewing"
+ novariants = TRUE
+ merge_type = /obj/item/stack/sheet/sinew/icewing
+ trophy_type = /datum/crafting_recipe/crusher_trophy/icewing_watcher_wing
+
+/obj/item/stack/sheet/sinew/magmawing
+ name = "magmawing watcher sinew"
+ desc = "Fiery filaments which presumably came from a magmawing watcher's wings."
+ singular_name = "magmawing watcher sinew"
+ icon_state = "sinew_magmawing"
+ novariants = TRUE
+ merge_type = /obj/item/stack/sheet/sinew/magmawing
+ trophy_type = /datum/crafting_recipe/crusher_trophy/magmawing_watcher_wing
+
/obj/item/stack/sheet/sinew/wolf
name = "wolf sinew"
desc = "Long stringy filaments which came from the insides of a wolf."
singular_name = "wolf sinew"
merge_type = /obj/item/stack/sheet/sinew/wolf
+ trophy_type = null
GLOBAL_LIST_INIT(sinew_recipes, list ( \
new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/cable/sinew, 1, crafting_flags = NONE, category = CAT_EQUIPMENT), \
@@ -315,7 +338,6 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
. = ..()
. += GLOB.sinew_recipes
-
/*Plates*/
/obj/item/stack/sheet/animalhide/goliath_hide
name = "goliath hide plates"
diff --git a/code/modules/bitrunning/objects/disks.dm b/code/modules/bitrunning/objects/disks.dm
index d206f6e96a9..56d8e3a58be 100644
--- a/code/modules/bitrunning/objects/disks.dm
+++ b/code/modules/bitrunning/objects/disks.dm
@@ -205,7 +205,7 @@
name = "bitrunning gear: proto-kinetic crusher mods"
selectable_items = list(
/obj/item/crusher_trophy/watcher_wing,
- /obj/item/crusher_trophy/blaster_tubes/magma_wing,
+ /obj/item/crusher_trophy/magma_wing,
/obj/item/crusher_trophy/legion_skull,
/obj/item/crusher_trophy/wolf_ear,
)
@@ -213,7 +213,7 @@
/obj/item/disk/bitrunning/item/pkc_mods/premium
name = "bitrunning gear: premium proto-kinetic crusher mods"
selectable_items = list(
- /obj/item/crusher_trophy/watcher_wing/ice_wing,
+ /obj/item/crusher_trophy/ice_wing,
/obj/item/crusher_trophy/blaster_tubes,
/obj/item/crusher_trophy/miner_eye,
/obj/item/crusher_trophy/tail_spike,
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 321c6c8b782..5545425b921 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -576,9 +576,8 @@
color = color = pick("#ff0077","#d400ff","#2600ff","#00ccff","#00ff2a","#e5ff00","#ffae00","#ff0000", "#ffffff")
/obj/item/clothing/neck/wreath
- name = "\improper Watcher Wreath"
- desc = "An elaborate crown made from the twisted flesh and sinew of a watcher. \
- Wearing it makes you feel like you have eyes in the back of your head."
+ name = "\improper watcher wreath"
+ desc = "An elaborate crown made from the twisted flesh and sinew of a watcher. Wearing it makes you feel like you have eyes in the back of your head."
icon_state = "watcher_wreath"
worn_y_offset = 10
alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER
@@ -591,8 +590,13 @@
. += emissive_appearance(icon_file, "wreath_emissive", src, alpha = src.alpha)
/obj/item/clothing/neck/wreath/icewing
- name = "\improper Icewing Wreath"
- desc = "An elaborate crown made from the twisted flesh and sinew of an icewing watcher. \
- Wearing it sends shivers down your spine just from being near it."
+ name = "\improper icewing wreath"
+ desc = "An elaborate crown made from the twisted flesh and sinew of an icewing watcher. You feel shivers down your spine just from being near it."
icon_state = "icewing_wreath"
custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2)
+
+/obj/item/clothing/neck/wreath/magmawing
+ name = "\improper magmawing wreath"
+ desc = "An elaborate crown made from the twisted flesh and sinew of an magmawing watcher. Wearing it sets your heart and skin ablaze."
+ icon_state = "magmawing_wreath"
+ custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2)
diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm
index 1036a196e4d..a45bff14814 100644
--- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm
@@ -198,33 +198,8 @@
if(QDELETED(target))
return
var/datum/status_effect/crusher_mark/mark = target.has_status_effect(/datum/status_effect/crusher_mark)
- if(!mark)
- return
- var/boosted_mark = mark.boosted
- if(!target.remove_status_effect(mark))
- return
- // Detonation effect
- var/datum/status_effect/crusher_damage/crusher_damage_effect = target.has_status_effect(/datum/status_effect/crusher_damage) || target.apply_status_effect(/datum/status_effect/crusher_damage)
- var/target_health = target.health
- var/combined_damage = detonation_damage
- for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies)
- combined_damage += crusher_trophy.on_mark_detonation(target, user)
- if(QDELETED(target))
- return
- if(!QDELETED(crusher_damage_effect))
- crusher_damage_effect.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
- new /obj/effect/temp_visual/kinetic_blast(get_turf(target))
- var/backstabbed = FALSE
- var/def_check = target.getarmor(type = BOMB)
- // Backstab bonus
- if(check_behind(user, target) && !HAS_TRAIT(target, TRAIT_BACKSTAB_IMMUNE) || boosted_mark)
- backstabbed = TRUE
- combined_damage += backstab_bonus
- playsound(user, backstab_sound, 100, TRUE) //Seriously who spelled it wrong
- if(!QDELETED(crusher_damage_effect))
- crusher_damage_effect.total_damage += combined_damage
- SEND_SIGNAL(user, COMSIG_LIVING_CRUSHER_DETONATE, target, src, backstabbed)
- target.apply_damage(combined_damage, BRUTE, blocked = def_check)
+ if(mark)
+ mark.detonate(src, user)
/obj/item/kinetic_crusher/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!istype(interacting_with, /obj/item/crusher_trophy))
@@ -259,6 +234,7 @@
SEND_SIGNAL(src, COMSIG_CRUSHER_FIRED_BLAST, target, user, destabilizer)
destabilizer.icon = projectile_icon
destabilizer.icon_state = projectile_icon_state
+ destabilizer.detonation_damage = detonation_damage
for(var/obj/item/crusher_trophy/attached_trophy as anything in trophies)
attached_trophy.on_projectile_fire(destabilizer, user)
destabilizer.aim_projectile(target, user, modifiers)
@@ -326,6 +302,8 @@
var/boosted = FALSE
/// Should this projectile go through allied mobs?
var/ignore_allies = FALSE
+ /// Mark detonation damage
+ var/detonation_damage = 50
/obj/projectile/destabilizer/Initialize(mapload)
. = ..()
@@ -364,7 +342,12 @@
if(QDELETED(target))
return ..()
var/mob/living/living_target = target
- living_target.apply_status_effect(/datum/status_effect/crusher_mark, boosted)
+ var/datum/status_effect/crusher_mark/crusher_mark = living_target.apply_status_effect(/datum/status_effect/crusher_mark, boosted, used_crusher)
+ if (!crusher_mark)
+ return ..()
+ crusher_mark.detonation_damage = detonation_damage
+ for(var/obj/item/crusher_trophy/crusher_trophy as anything in used_crusher?.trophies)
+ crusher_trophy.on_mark_applied(target, firer, crusher_mark)
return ..()
var/target_turf = get_turf(target)
diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm
index c2aee514722..7e183d8e851 100644
--- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm
+++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher_trophies.dm
@@ -7,14 +7,14 @@
desc = "A strange spike with no usage."
icon = 'icons/obj/mining_zones/artefacts.dmi'
icon_state = "tail_spike"
- /// if it has a bonus effect, this is how much that effect is
+ /// If it has a bonus effect, this is how much that effect is
var/bonus_value = 10
- /// id of the trophy to be sent by the signal
+ /// ID of the trophy to be sent by the signal
var/trophy_id
- /// what type of trophies will block this trophy from being added, must be overriden
+ /// What type of trophies will block this trophy from being added, must be overriden
var/denied_type = /obj/item/crusher_trophy
- /// what item will drop if you cut it with wildhunter's knife
- var/wildhunter_drop = null
+ /// What items will drop if you cut it with wildhunter's knife
+ var/list/wildhunter_drops = null
/obj/item/crusher_trophy/examine(mob/living/user)
. = ..()
@@ -32,7 +32,7 @@
to_chat(user, span_warning("You can't seem to attach [src] to [crusher]. Maybe remove a few trophies?"))
return FALSE
if(!user.transferItemToLoc(src, crusher))
- return
+ return FALSE
crusher.trophies += src
to_chat(user, span_notice("You attach [src] to [crusher]."))
return TRUE
@@ -57,9 +57,13 @@
/obj/item/crusher_trophy/proc/on_projectile_hit_mineral(turf/closed/mineral, mob/living/user) //the target and the user
return
+/// Does an effect when a mark is applied
+/obj/item/crusher_trophy/proc/on_mark_applied(mob/living/target, mob/living/user, datum/status_effect/crusher_mark)
+ return
+
/// Does an effect when you hit a mob that is marked via the projectile
/// Returns additional damage for detonation
-/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user
+/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc) //the target and the user
SHOULD_CALL_PARENT(TRUE)
//if we dont have a set id, use the typepath as identifier
SEND_SIGNAL(target, COMSIG_MOB_TROPHY_ACTIVATED(trophy_id || type), src, user)
diff --git a/code/modules/mining/equipment/kinetic_crusher/trophies_fauna.dm b/code/modules/mining/equipment/kinetic_crusher/trophies_fauna.dm
index df40bf4f05b..f0b0b3331f7 100644
--- a/code/modules/mining/equipment/kinetic_crusher/trophies_fauna.dm
+++ b/code/modules/mining/equipment/kinetic_crusher/trophies_fauna.dm
@@ -10,12 +10,13 @@
denied_type = /obj/item/crusher_trophy/watcher_wing
trophy_id = TROPHY_WATCHER
bonus_value = 5
- wildhunter_drop = /obj/item/stack/sheet/sinew
+ wildhunter_drops = list(/obj/item/stack/sheet/sinew = 7)
+ custom_materials = list(/datum/material/diamond = SHEET_MATERIAL_AMOUNT * 10, /datum/material/bone = SHEET_MATERIAL_AMOUNT * 5)
/obj/item/crusher_trophy/watcher_wing/effect_desc()
return "mark detonation to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s"
-/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
if(!ishostile(target))
return
@@ -28,31 +29,97 @@
hostile_animal.ranged_cooldown = bonus_value + world.time
//magmawing watcher
-/obj/item/crusher_trophy/blaster_tubes/magma_wing
+/obj/item/crusher_trophy/magma_wing
name = "magmawing watcher wing"
desc = "A still-searing wing from a magmawing watcher. Suitable as a trophy for a kinetic crusher."
icon_state = "magma_wing"
- gender = NEUTER
- bonus_value = 5
- wildhunter_drop = /obj/item/stack/sheet/sinew
+ denied_type = /obj/item/crusher_trophy/magma_wing
+ wildhunter_drops = list(/obj/item/stack/sheet/sinew/magmawing = 3)
+ custom_materials = list(/datum/material/diamond = SHEET_MATERIAL_AMOUNT * 6, /datum/material/bone = SHEET_MATERIAL_AMOUNT * 3)
+ /// List of mobs we've marked
+ var/list/mob/living/marked_targets = list()
-/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc()
- return "mark detonation to make the next destabilizer shot deal [bonus_value] damage"
+/obj/item/crusher_trophy/magma_wing/Destroy(force)
+ marked_targets.Cut()
+ return ..()
-/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "heated [marker.name]"
- marker.icon_state = "lava"
- marker.damage = bonus_value
- deadly_shot = FALSE
+/obj/item/crusher_trophy/magma_wing/effect_desc()
+ return "attacks of marked enemies to cause mark detonation"
+
+/obj/item/crusher_trophy/magma_wing/remove_from(obj/item/kinetic_crusher/crusher, mob/living/user)
+ . = ..()
+ for (var/mob/living/mark_on as anything in marked_targets)
+ UnregisterSignal(mark_on, list(COMSIG_LIVING_STATUS_REMOVED, COMSIG_HOSTILE_POST_ATTACKINGTARGET, COMSIG_QDELETING))
+ marked_targets.Cut()
+
+/obj/item/crusher_trophy/magma_wing/on_mark_applied(mob/living/target, mob/living/user, datum/status_effect/crusher_mark)
+ . = ..()
+ // Shouldn't happen, but just in case
+ if (marked_targets[target])
+ return
+ marked_targets[target] = TRUE
+ RegisterSignal(target, COMSIG_LIVING_STATUS_REMOVED, PROC_REF(on_status_removed))
+ RegisterSignal(target, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(on_hostile_attacking))
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_deleted))
+
+/obj/item/crusher_trophy/magma_wing/proc/on_status_removed(mob/living/source, datum/status_effect/removed)
+ SIGNAL_HANDLER
+
+ if (istype(removed, /datum/status_effect/crusher_mark))
+ UnregisterSignal(source, list(COMSIG_LIVING_STATUS_REMOVED, COMSIG_HOSTILE_POST_ATTACKINGTARGET, COMSIG_QDELETING))
+ marked_targets -= source
+
+/obj/item/crusher_trophy/magma_wing/proc/on_target_deleted(mob/living/source)
+ SIGNAL_HANDLER
+
+ UnregisterSignal(source, list(COMSIG_LIVING_STATUS_REMOVED, COMSIG_HOSTILE_POST_ATTACKINGTARGET, COMSIG_QDELETING))
+ marked_targets -= source
+
+/obj/item/crusher_trophy/magma_wing/proc/on_hostile_attacking(mob/living/source, atom/target, result)
+ SIGNAL_HANDLER
+
+ if (!isliving(target) || !istype(loc, /obj/item/kinetic_crusher))
+ return
+
+ var/mob/living/living_target = target
+ var/datum/status_effect/crusher_mark/crusher_mark = source.has_status_effect(/datum/status_effect/crusher_mark)
+ var/mob/living/crusher_user = null
+ var/obj/item/kinetic_crusher/used_crusher = loc
+ // Count hits on crusher wielder as detonations caused by them
+ if (living_target.get_active_held_item() == used_crusher)
+ crusher_user = living_target
+ if (!isnull(crusher_mark))
+ playsound(source, used_crusher.backstab_sound, 100, TRUE) // Give feedback that a detonation has occured
+ crusher_mark.detonate(used_crusher, crusher_user, melee_hit = FALSE)
//icewing watcher
-/obj/item/crusher_trophy/watcher_wing/ice_wing
+/obj/item/crusher_trophy/ice_wing
name = "icewing watcher wing"
desc = "A carefully preserved frozen wing from an icewing watcher. Suitable as a trophy for a kinetic crusher."
icon_state = "ice_wing"
- bonus_value = 8
- wildhunter_drop = /obj/item/stack/sheet/sinew
+ bonus_value = 2
+ denied_type = /obj/item/crusher_trophy/ice_wing
+ wildhunter_drops = list(/obj/item/stack/sheet/sinew/icewing = 3)
+ custom_materials = list(/datum/material/diamond = SHEET_MATERIAL_AMOUNT * 6, /datum/material/bone = SHEET_MATERIAL_AMOUNT * 3)
+
+/obj/item/crusher_trophy/ice_wing/effect_desc()
+ return "user to backstep [bonus_value] tile\s when detonating a mark"
+
+/obj/item/crusher_trophy/ice_wing/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
+ . = ..()
+ if (!user)
+ return
+ var/step_dir = get_dir(target, user)
+ for (var/i in 1 to bonus_value)
+ var/turf/open/behind_user = get_step(user, step_dir)
+ if (!istype(behind_user) || behind_user.is_blocked_turf(source_atom = user))
+ return
+ // Don't backstep into chasms, lava or fire
+ if (ischasm(behind_user) || islava(behind_user) || (locate(/obj/effect/hotspot) in behind_user))
+ return
+ // Don't try further moves if you fail once
+ if (!user.Move(behind_user, step_dir, FALSE, FALSE))
+ return
//legion
/obj/item/crusher_trophy/legion_skull
@@ -61,7 +128,8 @@
icon_state = "legion_skull"
denied_type = /obj/item/crusher_trophy/legion_skull
bonus_value = 3
- wildhunter_drop = /obj/item/organ/monster_core/regenerative_core/legion // if you killed blood drunk you can afford stabilizer potions sooo....
+ // No wildhunter drop to prevent refresh cheese
+ custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 5)
/obj/item/crusher_trophy/legion_skull/effect_desc()
return "a kinetic crusher to recharge [bonus_value*0.1] second\s faster"
@@ -84,21 +152,18 @@
denied_type = /obj/item/crusher_trophy/goliath_tentacle
bonus_value = 2
trophy_id = TROPHY_GOLIATH_TENTACLE
- wildhunter_drop = /obj/item/stack/sheet/animalhide/goliath_hide
+ wildhunter_drops = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3)
+ custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 8)
/// Your missing health is multiplied by this value to find the bonus damage
var/missing_health_ratio = 0.1
- /// Amount of health you must lose to gain damage, according to the examine text. Cached so we don't recalculate it every examine.
- var/missing_health_desc
-
-/obj/item/crusher_trophy/goliath_tentacle/Initialize(mapload)
- . = ..()
- missing_health_desc = 1 / missing_health_ratio / bonus_value
/obj/item/crusher_trophy/goliath_tentacle/effect_desc()
- return "mark detonation to do [bonus_value] more damage for every [missing_health_desc] health you are missing"
+ return "mark detonation to do [bonus_value] more damage for every [1 / missing_health_ratio] health you are missing"
-/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
+ if (!user)
+ return
var/missing_health = user.maxHealth - user.health
missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health
missing_health *= bonus_value //multiply the remaining amount by bonus_value
@@ -109,16 +174,17 @@
/obj/item/crusher_trophy/lobster_claw
name = "lobster claw"
icon_state = "lobster_claw"
- desc = "A lobster claw."
+ desc = "A lobster claw. Suitable as a trophy for a kinetic crusher."
denied_type = /obj/item/crusher_trophy/lobster_claw
trophy_id = TROPHY_LOBSTER_CLAW
bonus_value = 1
- wildhunter_drop = /obj/item/organ/monster_core/rush_gland
+ // No wildhunter drop to prevent refresh cheese
+ custom_materials = list(/datum/material/meat = SHEET_MATERIAL_AMOUNT * 12, /datum/material/bone = SHEET_MATERIAL_AMOUNT * 5)
/obj/item/crusher_trophy/lobster_claw/effect_desc()
return "mark detonation to briefly rebuke the target for [bonus_value] second[bonus_value > 1 ? "s" : ""]"
-/obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
target.apply_status_effect(/datum/status_effect/rebuked, bonus_value SECONDS)
@@ -129,14 +195,14 @@
desc = "A fang from a brimdemon's corpse."
denied_type = /obj/item/crusher_trophy/brimdemon_fang
trophy_id = TROPHY_BRIMDEMON_FANG
- wildhunter_drop = /obj/item/organ/monster_core/brimdust_sac
+ // No wildhunter drop to prevent refresh cheese
/// Cartoon punching vfx
var/static/list/comic_phrases = list("BOOM", "BANG", "KABLOW", "KAPOW", "OUCH", "BAM", "KAPOW", "WHAM", "POW", "KABOOM")
/obj/item/crusher_trophy/brimdemon_fang/effect_desc()
return "mark detonation to create visual and audiosensory effects at the target"
-/obj/item/crusher_trophy/brimdemon_fang/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/brimdemon_fang/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
target.loc.balloon_alert_to_viewers("[pick(comic_phrases)]!")
playsound(target, 'sound/mobs/non-humanoids/brimdemon/brimdemon_crush.ogg', 100)
@@ -148,7 +214,8 @@
icon_state = "bileworm_spewlet"
desc = "A baby bileworm. Suitable as a trophy for a kinetic crusher."
denied_type = /obj/item/crusher_trophy/bileworm_spewlet
- wildhunter_drop = /obj/item/stack/sheet/animalhide/bileworm
+ wildhunter_drops = list(/obj/item/stack/sheet/animalhide/bileworm = 3)
+ custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 12)
///item ability that handles the effect
var/datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/spewlet/ability
@@ -172,7 +239,7 @@
/obj/item/crusher_trophy/bileworm_spewlet/effect_desc()
return "mark detonation launches projectiles in cardinal directions on a 10 second cooldown. Also gives you an AOE when mining minerals"
-/obj/item/crusher_trophy/bileworm_spewlet/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/bileworm_spewlet/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
//ability itself handles cooldowns.
ability.InterceptClickOn(user, null, target)
@@ -238,7 +305,7 @@
/obj/item/crusher_trophy/ice_demon_cube/effect_desc()
return "mark detonation to unleash demonic ice clones upon the target"
-/obj/item/crusher_trophy/ice_demon_cube/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/ice_demon_cube/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
if(isnull(target) || !COOLDOWN_FINISHED(src, summon_cooldown))
return
@@ -271,7 +338,7 @@
/obj/item/crusher_trophy/wolf_ear/effect_desc()
return "mark detonation to gain a slight speed boost temporarily"
-/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
user.apply_status_effect(/datum/status_effect/speed_boost, 1 SECONDS)
@@ -286,7 +353,7 @@
/obj/item/crusher_trophy/bear_paw/effect_desc()
return "mark detonation to attack twice if you are below half your life"
-/obj/item/crusher_trophy/bear_paw/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/bear_paw/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
if(user.health / user.maxHealth > 0.5)
return
@@ -301,7 +368,7 @@
icon_state = "raptor_feather"
denied_type = /obj/item/crusher_trophy/raptor_feather
trophy_id = TROPHY_RAPTOR_FEATHER
- wildhunter_drop = /obj/item/food/meat/slab/chicken
+ wildhunter_drops = list(/obj/item/food/meat/slab/chicken = 1)
/obj/item/crusher_trophy/raptor_feather/effect_desc()
return "your shots to go through your allies"
diff --git a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm
index 09d15bef6ba..e91b2b07f51 100644
--- a/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm
+++ b/code/modules/mining/equipment/kinetic_crusher/trophies_megafauna.dm
@@ -13,7 +13,7 @@
/obj/item/crusher_trophy/miner_eye/effect_desc()
return "mark detonation to grant stun immunity and 90% damage reduction for 1 second"
-/obj/item/crusher_trophy/miner_eye/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/miner_eye/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
user.apply_status_effect(/datum/status_effect/blooddrunk)
@@ -27,7 +27,7 @@
/obj/item/crusher_trophy/tail_spike/effect_desc()
return "mark detonation to do [bonus_value] damage to nearby creatures and push them back"
-/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
for(var/mob/living/living_target in oview(2, user))
if(user.faction_check_atom(living_target) || living_target.stat == DEAD)
@@ -74,11 +74,11 @@
/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user)
user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order)
-/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order)
-//colossus
+// Colossus, allows user to fire shots during click CD
/obj/item/crusher_trophy/blaster_tubes
name = "blaster tubes"
desc = "The blaster tubes from a colossus's arm. Suitable as a trophy for a kinetic crusher."
@@ -87,26 +87,48 @@
denied_type = /obj/item/crusher_trophy/blaster_tubes
bonus_value = 15
trophy_id = TROPHY_BLASTER_TUBES
- var/deadly_shot = FALSE
/obj/item/crusher_trophy/blaster_tubes/effect_desc()
- return "mark detonation to make the next destabilizer shot deal [bonus_value] damage but move slower"
+ return "destabilizer shots to be fire-able freely inbetween swings"
-/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
- if(deadly_shot)
- marker.name = "deadly [marker.name]"
- marker.icon_state = "chronobolt"
- marker.damage = bonus_value
- marker.speed = 2
- deadly_shot = FALSE
-
-/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/blaster_tubes/add_to(obj/item/kinetic_crusher/crusher, mob/living/user)
. = ..()
- deadly_shot = TRUE
- addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE)
+ if (!.)
+ return
+ RegisterSignal(crusher, COMSIG_ITEM_EQUIPPED, PROC_REF(on_crusher_equipped))
+ RegisterSignal(crusher, COMSIG_ITEM_DROPPED, PROC_REF(on_crusher_dropped))
+ if (user.get_slot_by_item(crusher) == ITEM_SLOT_HANDS)
+ RegisterSignal(user, COMSIG_MOB_CLICKON, PROC_REF(try_crusher_fire))
-/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot()
- deadly_shot = FALSE
+/obj/item/crusher_trophy/blaster_tubes/remove_from(obj/item/kinetic_crusher/crusher, mob/living/user)
+ . = ..()
+ UnregisterSignal(crusher, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
+ if (ismob(crusher.loc))
+ UnregisterSignal(crusher.loc, COMSIG_MOB_CLICKON)
+
+/obj/item/crusher_trophy/blaster_tubes/proc/on_crusher_equipped(obj/item/kinetic_crusher/source, mob/user, slot)
+ SIGNAL_HANDLER
+
+ if (slot == ITEM_SLOT_HANDS && isliving(user))
+ RegisterSignal(user, COMSIG_MOB_CLICKON, PROC_REF(try_crusher_fire))
+
+/obj/item/crusher_trophy/blaster_tubes/proc/on_crusher_dropped(obj/item/kinetic_crusher/source, mob/user)
+ SIGNAL_HANDLER
+ UnregisterSignal(user, COMSIG_MOB_CLICKON)
+
+/obj/item/crusher_trophy/blaster_tubes/proc/try_crusher_fire(mob/living/user, atom/target, list/modifiers)
+ SIGNAL_HANDLER
+
+ // Only trigger on normal RMB when on cooldown
+ if (user.next_move < world.time || !LAZYACCESS(modifiers, RIGHT_CLICK) || LAZYACCESS(modifiers, SHIFT_CLICK) || LAZYACCESS(modifiers, CTRL_CLICK) || LAZYACCESS(modifiers, ALT_CLICK))
+ return
+
+ if (INCAPACITATED_IGNORING(user, INCAPABLE_STASIS) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || user.throw_mode || (!LAZYACCESS(modifiers, "catcher") && target.IsObscured()))
+ return
+
+ var/obj/item/kinetic_crusher/crusher = loc
+ if (istype(crusher) && user.get_active_held_item() == crusher) // istype() just in case, crusher handles wielding/CD in its secondary interact on its own
+ crusher.interact_with_atom_secondary(target, user, modifiers) // Standard shot recharge delay is 1.5 seconds (swing + shot CDs would be 1.6) so its fine to not have a penalty
//hierophant
/obj/item/crusher_trophy/vortex_talisman
@@ -119,7 +141,7 @@
/obj/item/crusher_trophy/vortex_talisman/effect_desc()
return "mark detonation to create a homing hierophant chaser"
-/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
if(isliving(target))
var/obj/effect/temp_visual/hierophant/chaser/chaser = new(get_turf(user), user, target, 3, TRUE)
@@ -138,7 +160,7 @@
/obj/item/crusher_trophy/ice_block_talisman/effect_desc()
return "mark detonation to freeze a creature in a block of ice for a period, preventing them from moving"
-/obj/item/crusher_trophy/ice_block_talisman/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/ice_block_talisman/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
target.apply_status_effect(/datum/status_effect/ice_block_talisman)
@@ -181,7 +203,7 @@
/obj/item/crusher_trophy/broodmother_tongue/effect_desc()
return "mark detonation to have a [bonus_value]% chance to summon a patch of goliath tentacles at the target's location"
-/obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
if(prob(bonus_value) && target.stat != DEAD)
new /obj/effect/goliath_tentacle/broodmother/patch(get_turf(target), user)
@@ -216,7 +238,7 @@
/obj/item/crusher_trophy/legionnaire_spine/effect_desc()
return "mark detonation to have a [bonus_value]% chance to summon a loyal legion skull"
-/obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
if(!prob(bonus_value) || target.stat == DEAD)
return
@@ -254,6 +276,6 @@
/obj/item/crusher_trophy/flesh_glob/on_melee_hit(mob/living/target, mob/living/user)
user.heal_ordered_damage(bonus_value * 0.2, damage_heal_order)
-/obj/item/crusher_trophy/flesh_glob/on_mark_detonation(mob/living/target, mob/living/user)
+/obj/item/crusher_trophy/flesh_glob/on_mark_detonation(mob/living/target, mob/living/user, obj/item/kinetic_crusher/pkc)
. = ..()
user.heal_ordered_damage(bonus_value * 0.5, damage_heal_order)
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm b/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm
index 74d7267e465..a3ccc742457 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm
@@ -137,7 +137,7 @@
AddComponent(\
/datum/component/butchering, \
speed = 1.5 SECONDS , \
- effectiveness = 110, \
+ effectiveness = 125, \
bonus_modifier = 0, \
)
@@ -149,11 +149,17 @@
if(!istype(interacting_with, /obj/item/crusher_trophy))
return NONE
var/obj/item/crusher_trophy/trophy = interacting_with
- if(isnull(trophy.wildhunter_drop))
+ if(!length(trophy.wildhunter_drops))
return NONE
balloon_alert(user, "cutting trophy...")
if(!do_after(user, 4 SECONDS, trophy))
return ITEM_INTERACT_BLOCKING
- new trophy.wildhunter_drop(trophy.drop_location())
+ for (var/path, count in trophy.wildhunter_drops)
+ if (ispath(path, /obj/item/stack))
+ new path(trophy.drop_location(), count)
+ continue
+
+ for (var/i in 1 to count)
+ new path(trophy.drop_location())
qdel(trophy)
return ITEM_INTERACT_SUCCESS
diff --git a/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm b/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm
index 19d1fd20c6a..8b7c74eaa03 100644
--- a/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm
+++ b/code/modules/mob/living/basic/lavaland/bileworm/_bileworm.dm
@@ -12,8 +12,6 @@
verb_ask = "spittles questioningly"
verb_exclaim = "splutters and gurgles"
verb_yell = "splutters and gurgles"
- crusher_loot = /obj/item/crusher_trophy/bileworm_spewlet
- crusher_drop_chance = 15
butcher_results = list(/obj/item/food/meat/slab/bugmeat = 4)
guaranteed_butcher_results = list(
/obj/effect/gibspawner/generic = 1,
diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm
index 74d20946737..2fade1b1dcc 100644
--- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm
+++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_instrument.dm
@@ -6,7 +6,7 @@
icon_state = "bilehorn"
allowed_instrument_ids = "bilehorn"
inhand_icon_state = null
- custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2)
+ custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT * 12, /datum/material/bone = SHEET_MATERIAL_AMOUNT * 2)
/datum/crafting_recipe/bilehorn
name = "Bilehorn"
diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm
index 63e2190d015..ba1c54be70e 100644
--- a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm
+++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm
@@ -27,7 +27,6 @@
ai_controller = /datum/ai_controller/basic_controller/brimdemon
- crusher_loot = /obj/item/crusher_trophy/brimdemon_fang
butcher_results = list(
/obj/item/food/meat/slab = 2,
/obj/effect/decal/cleanable/brimdust = 1,
diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
index 972127977ed..6220f9f0278 100644
--- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
+++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
@@ -29,7 +29,6 @@
ai_controller = /datum/ai_controller/basic_controller/goliath
- crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
butcher_results = list(/obj/item/food/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2)
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1)
/// Icon state to use when tentacles are available
@@ -199,7 +198,6 @@
This one is clearly ancient, and its tentacles constantly churn the earth around it."
maxHealth = 400
health = 400
- crusher_drop_chance = 100
/// Don't re-check nearby turfs for this long
COOLDOWN_DECLARE(retarget_turfs_cooldown)
/// List of places we might spawn a tentacle, if we're alive
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm
index f738e35bf8c..36016b7f179 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm
@@ -23,7 +23,6 @@
speak_emote = list("gurgles")
attack_sound = 'sound/items/weapons/pierce.ogg'
throw_blocked_message = "bounces harmlessly off of"
- crusher_loot = /obj/item/crusher_trophy/legion_skull
death_message = "wails in chorus and dissolves into quivering flesh."
ai_controller = /datum/ai_controller/basic_controller/legion
/// What kind of mob do we spawn?
@@ -142,10 +141,8 @@
maxHealth = 60
health = 60
speed = 2
- crusher_drop_chance = 20
corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf
-
/// Like a Legion but larger and spawns regular Legions, not currently used anywhere and very soulful
/mob/living/basic/mining/legion/large
name = "myriad"
diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm
index 1801d2dc189..ecf69e02a9a 100644
--- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm
+++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm
@@ -25,7 +25,6 @@
/obj/item/stack/sheet/bone = 2,
/obj/item/organ/monster_core/rush_gland = 1,
)
- crusher_loot = /obj/item/crusher_trophy/lobster_claw
ai_controller = /datum/ai_controller/basic_controller/lobstrosity
/// Charging ability
var/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/charge
@@ -160,7 +159,6 @@
/obj/item/stack/sheet/bone = 1,
/obj/item/organ/monster_core/rush_gland = 1,
)
- crusher_loot = null
ai_controller = /datum/ai_controller/basic_controller/lobstrosity/juvenile
snip_speed = 6.5 SECONDS
charge_type = /datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/shrimp
diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm
index 967c05d44a1..4eceea8a73c 100644
--- a/code/modules/mob/living/basic/lavaland/watcher/watcher.dm
+++ b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm
@@ -18,7 +18,6 @@
attack_sound = 'sound/items/weapons/bladeslice.ogg'
attack_verb_continuous = "buffets"
attack_verb_simple = "buffet"
- crusher_loot = /obj/item/crusher_trophy/watcher_wing
ai_controller = /datum/ai_controller/basic_controller/watcher
butcher_results = list(
/obj/item/stack/sheet/bone = 1,
@@ -90,8 +89,11 @@
health = 175
projectile_type = /obj/projectile/temp/watcher/magma_wing
gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/fire
- crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
- crusher_drop_chance = 100 // There's only going to be one of these per round throw them a bone
+ butcher_results = list(
+ /obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/ore/diamond = 2,
+ /obj/item/stack/sheet/sinew/magmawing = 3,
+ )
/// Less durable, freezing projectiles
/mob/living/basic/mining/watcher/icewing
@@ -106,5 +108,8 @@
projectile_type = /obj/projectile/temp/watcher/ice_wing
gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/ice
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1)
- crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
- crusher_drop_chance = 100
+ butcher_results = list(
+ /obj/item/stack/sheet/bone = 1,
+ /obj/item/stack/ore/diamond = 5,
+ /obj/item/stack/sheet/sinew/icewing = 3,
+ )
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index 6dad4d75a7b..73c09c79a8f 100644
Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ
diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi
index 6fc8b054ca5..6ca5f8655de 100644
Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 70f5aaa62be..f284a1539b5 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ