diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm index 05fe8f644d0c..4999790aab39 100644 --- a/code/__DEFINES/equipment.dm +++ b/code/__DEFINES/equipment.dm @@ -94,6 +94,8 @@ #define SMARTGUNNER_BACKPACK_OVERRIDE (1<<15) /// The item will incur click delay if an empty adjacent tile is clicked #define ADJACENT_CLICK_DELAY (1<<16) +/// Is in the process of falling apart. +#define ITEM_DISSOLVING (1<<17) //========================================================================================== diff --git a/code/game/machinery/vending/vendor_types/antag/antag_predator.dm b/code/game/machinery/vending/vendor_types/antag/antag_predator.dm index b2c6e21ae160..2857d33c4f29 100644 --- a/code/game/machinery/vending/vendor_types/antag/antag_predator.dm +++ b/code/game/machinery/vending/vendor_types/antag/antag_predator.dm @@ -1,6 +1,6 @@ GLOBAL_LIST_INIT(cm_vending_equipment_yautja, list( list("Essential Hunting Supplies", 0, null, null, null), - list("Hunting Equipment", 0, list(/obj/item/clothing/under/chainshirt/hunter, /obj/item/storage/backpack/yautja, /obj/item/storage/medicomp/full, /obj/item/device/yautja_teleporter), MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("Hunting Equipment", 0, list(/obj/item/clothing/under/chainshirt/hunter, /obj/item/storage/backpack/yautja, /obj/item/storage/medicomp/full, /obj/item/device/yautja_teleporter, /obj/item/tool/yautja_cleaner), MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("Armor", 0, list(/obj/item/clothing/suit/armor/yautja/hunter, /obj/item/clothing/mask/gas/yautja/hunter, /obj/item/clothing/accessory/mask, /obj/item/clothing/shoes/yautja/hunter/knife), MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), list("Main Weapons (CHOOSE 1)", 0, null, null, null), diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8099fb2fe7b1..2cb40ca42131 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -317,6 +317,8 @@ . += desc if(desc_lore) . += SPAN_NOTICE("This has an extended lore description.") + if(flags_item & ITEM_DISSOLVING) + . += SPAN_WARNING("It is currently dissolving into bits!") /obj/item/attack_hand(mob/user) if (!user) @@ -354,7 +356,6 @@ /obj/item/attackby(obj/item/W, mob/user) if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACKED, W, user) & COMPONENT_CANCEL_ITEM_ATTACK) return - if(istype(W,/obj/item/storage)) var/obj/item/storage/S = W if(S.storage_flags & STORAGE_CLICK_GATHER && isturf(loc)) @@ -1124,6 +1125,43 @@ animate(time = 1) animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) +/obj/item/proc/handle_dissolve(mob/user) + if(!HAS_TRAIT(user, TRAIT_YAUTJA_TECH)) + to_chat(user, SPAN_WARNING("You have no idea what this even does...")) + return FALSE + if(user.alpha < 255) + to_chat(user, SPAN_BOLDWARNING("It would not be safe to attempt this while cloaked!")) + return FALSE + if(anchored) + to_chat(user, SPAN_WARNING("\The [src] cannot be moved by any means, why dissolve it?")) + return FALSE + + var/mob/living/location = loc + if(istype(location)) + to_chat(user, SPAN_WARNING("You cannot dissolve this while it is being held!")) + return FALSE + + dissolve(user) + return TRUE + +/obj/item/proc/dissolve(mob/user) + user.visible_message(SPAN_DANGER("[user] uncaps a vial and begins to pour out a vibrant blue liquid over \the [src]!"), + SPAN_NOTICE("You begin to spread dissolving gel onto \the [src]!")) + if(do_after(user, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) + user.visible_message(SPAN_DANGER("[user] pours blue liquid all over \the [src]!"), + SPAN_NOTICE("You cover \the [src] with dissolving gel!")) + playsound(src.loc, 'sound/effects/acid_sizzle1.ogg', 25) + add_filter("dissolve_gel", 1, list("type" = "outline", "color" = "#3333FFff", "size" = 1)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 15 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, visible_message), SPAN_WARNING("[src] crumbles into pieces!")), 15 SECONDS) + flags_item |= ITEM_DISSOLVING + log_attack("[key_name(user)] dissolved [src] with Yautja Cleaner!") + return TRUE + else + user.visible_message(SPAN_WARNING("[user] stops pouring liquid on to \the [src]!"), + SPAN_WARNING("You decide not to cover \the [src] with dissolving gel.")) + return FALSE + ///Called by /mob/living/carbon/swap_hand() when hands are swapped /obj/item/proc/hands_swapped(mob/living/carbon/swapper_of_hands) return diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 9a8b43be53eb..b1f21bd4db8c 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -595,6 +595,8 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ //This proc is called when you want to place an item into the storage item. /obj/item/storage/attackby(obj/item/W as obj, mob/user as mob) ..() + if(istype(W, /obj/item/tool/yautja_cleaner) && user.a_intent == INTENT_HARM) + return return attempt_item_insertion(W, FALSE, user) /obj/item/storage/equipped(mob/user, slot, silent) diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index 9096134cdd69..cb51e061354f 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -93,8 +93,6 @@ icon_state = "halfarmor[armor_number]_[armor_material]" LAZYSET(item_state_slots, WEAR_JACKET, "halfarmor[armor_number]_[armor_material]") - - /obj/item/clothing/suit/armor/yautja/hunter name = "clan armor" desc = "A suit of armor with light padding. It looks old, yet functional." @@ -1099,6 +1097,28 @@ new_access = list(ACCESS_YAUTJA_SECURE, ACCESS_YAUTJA_ELITE, ACCESS_YAUTJA_ELDER, ACCESS_YAUTJA_ANCIENT) access = new_access +/obj/item/tool/yautja_cleaner + name = "cleanser gel vial" + desc = "Used for dissolving the gear of the fallen whilst in the field." + icon = 'icons/obj/items/hunter/pred_gear.dmi' + icon_state = "blue_gel" + force = 0 + throwforce = 1 + w_class = SIZE_SMALL + flags_item = ITEM_PREDATOR + black_market_value = 150 + +/obj/item/tool/yautja_cleaner/afterattack(obj/item/target, mob/user, proximity) + if(!isitem(target)) + return + if(istype(target, /obj/item/storage) && user.a_intent !=INTENT_HARM) + return + target.handle_dissolve(user) + +/obj/item/tool/yautja_cleaner/handle_dissolve(mob/user) + to_chat(user, SPAN_WARNING("You cannot dissolve more dissolving fluid...")) + return FALSE + /obj/item/storage/medicomp name = "medicomp" desc = "A complex kit of alien tools and medicines." diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index ea9ad4985303..a9fc664487ec 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -988,7 +988,6 @@ if(refund) spikes++ return TRUE - /obj/item/weapon/gun/energy/yautja icon = 'icons/obj/items/hunter/pred_gear.dmi' icon_state = null diff --git a/icons/obj/items/hunter/pred_gear.dmi b/icons/obj/items/hunter/pred_gear.dmi index 8493fde199c7..8704d772963e 100644 Binary files a/icons/obj/items/hunter/pred_gear.dmi and b/icons/obj/items/hunter/pred_gear.dmi differ