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