diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm index 90d78389890b..a6b62cf60723 100644 --- a/code/__DEFINES/equipment.dm +++ b/code/__DEFINES/equipment.dm @@ -92,6 +92,8 @@ #define FORCEDROP_CONDITIONAL (1<<14) /// Overrides smartgunner not being able to wear backpacks #define SMARTGUNNER_BACKPACK_OVERRIDE (1<<15) +/// Is in the process of falling apart. +#define ITEM_DISSOLVING (1<<16) //========================================================================================== 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 fab954def432..6338289ff76d 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..a3fc1198c953 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,9 @@ /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/tool/yautja_cleaner))) + if(handle_dissolve(src)) + return if(istype(W,/obj/item/storage)) var/obj/item/storage/S = W if(S.storage_flags & STORAGE_CLICK_GATHER && isturf(loc)) @@ -1124,6 +1128,46 @@ animate(time = 1) animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) +/obj/item/proc/handle_dissolve(obj/item/melting) + if(!HAS_TRAIT(usr, TRAIT_YAUTJA_TECH)) + to_chat(usr, SPAN_WARNING("You have no idea what this even does...")) + return FALSE + if(istype(melting, /obj/item/tool/yautja_cleaner)) + to_chat(usr, SPAN_WARNING("You cannot dissolve more dissolving fluid...")) + return FALSE + if(usr.alpha < 255) + to_chat(usr, SPAN_BOLDWARNING("It would not be safe to attempt this while cloaked!")) + return FALSE + if(anchored) + to_chat(usr, SPAN_WARNING("\The [src] cannot be moved by any means, why dissolve it?")) + return FALSE + + var/mob/living/location = loc + var/mob/living/loc_loc = loc.loc + if(istype(location) || istype(loc_loc)) + to_chat(usr, SPAN_WARNING("You cannot dissolve this while it is being held!")) + return FALSE + + dissolve() + return TRUE + +/obj/item/proc/dissolve() + usr.visible_message(SPAN_DANGER("[usr] 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(usr, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) + usr.visible_message(SPAN_DANGER("[usr] 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(usr)] dissolved [src] with Yautja Cleaner!") + return TRUE + else + usr.visible_message(SPAN_WARNING("[usr] 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/modules/cm_preds/smartdisc.dm b/code/modules/cm_preds/smartdisc.dm index 15a1f7ef0fbd..35e488cfbfd0 100644 --- a/code/modules/cm_preds/smartdisc.dm +++ b/code/modules/cm_preds/smartdisc.dm @@ -20,6 +20,12 @@ force = 15 throwforce = 25 +/obj/item/explosive/grenade/spawnergrenade/smartdisc/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/tool/yautja_cleaner)) + if(handle_dissolve()) + return + ..() + /obj/item/explosive/grenade/spawnergrenade/smartdisc/launch_towards(datum/launch_metadata/LM) ..() var/mob/user = usr diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index 9096134cdd69..2ac3ec01ddbb 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -95,6 +95,12 @@ +/obj/item/clothing/shoes/yautja/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/tool/yautja_cleaner)) + if(handle_dissolve()) + return + ..() + /obj/item/clothing/suit/armor/yautja/hunter name = "clan armor" desc = "A suit of armor with light padding. It looks old, yet functional." @@ -328,6 +334,12 @@ black_market_value = 100 flags_item = ITEM_PREDATOR +/obj/item/device/radio/headset/yautja/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/tool/yautja_cleaner)) + if(handle_dissolve()) + return + ..() + /obj/item/device/radio/headset/yautja/talk_into(mob/living/M as mob, message, channel, verb = "commands", datum/language/speaking) if(!isyautja(M)) //Nope. to_chat(M, SPAN_WARNING("You try to talk into the headset, but just get a horrible shrieking in your ears!")) @@ -1099,6 +1111,17 @@ 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/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 b3534b2ab5fc..d82cdd5a714f 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -990,6 +990,11 @@ if(refund) spikes++ return TRUE +/obj/item/weapon/gun/launcher/spike/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/tool/yautja_cleaner)) + if(handle_dissolve()) + return + ..() /obj/item/weapon/gun/energy/yautja icon = 'icons/obj/items/hunter/pred_gear.dmi' @@ -1003,6 +1008,12 @@ WEAR_R_HAND = 'icons/mob/humans/onmob/hunter/items_righthand.dmi' ) +/obj/item/weapon/gun/energy/yautja/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/tool/yautja_cleaner)) + if(handle_dissolve()) + return + ..() + /obj/item/weapon/gun/energy/yautja/plasmarifle name = "plasma rifle" desc = "A long-barreled heavy plasma weapon. Intended for combat, not hunting. Has an integrated battery that allows for a functionally unlimited amount of shots to be discharged. Equipped with an internal gyroscopic stabilizer allowing its operator to fire the weapon one-handed if desired" diff --git a/icons/obj/items/hunter/pred_gear.dmi b/icons/obj/items/hunter/pred_gear.dmi index a3400f9b3d72..1bbf430ea0ef 100644 Binary files a/icons/obj/items/hunter/pred_gear.dmi and b/icons/obj/items/hunter/pred_gear.dmi differ