diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index bf2f6dd4bb..e444ecce25 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -1,50 +1,50 @@ -/obj/item/grenade - name = "grenade" - desc = "It has an adjustable timer." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/grenade.dmi' - icon_state = "grenade" - item_state = "flashbang" - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - throw_speed = 3 - throw_range = 7 - flags_1 = CONDUCT_1 - slot_flags = SLOT_BELT - resistance_flags = FLAMMABLE - max_integrity = 40 - var/active = 0 - var/det_time = 50 - var/display_timer = 1 - -/obj/item/grenade/deconstruct(disassembled = TRUE) - if(!disassembled) - prime() - if(!QDELETED(src)) - qdel(src) - -/obj/item/grenade/proc/clown_check(mob/living/carbon/human/user) - if(user.disabilities & CLUMSY && prob(50)) - to_chat(user, "Huh? How does this thing work?") +/obj/item/grenade + name = "grenade" + desc = "It has an adjustable timer." + w_class = WEIGHT_CLASS_SMALL + icon = 'icons/obj/grenade.dmi' + icon_state = "grenade" + item_state = "flashbang" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + throw_speed = 3 + throw_range = 7 + flags_1 = CONDUCT_1 + slot_flags = SLOT_BELT + resistance_flags = FLAMMABLE + max_integrity = 40 + var/active = 0 + var/det_time = 50 + var/display_timer = 1 + +/obj/item/grenade/deconstruct(disassembled = TRUE) + if(!disassembled) + prime() + if(!QDELETED(src)) + qdel(src) + +/obj/item/grenade/proc/clown_check(mob/living/carbon/human/user) + if(user.disabilities & CLUMSY && prob(50)) + to_chat(user, "Huh? How does this thing work?") preprime(user, 5, FALSE) return FALSE return TRUE - - -/obj/item/grenade/examine(mob/user) - ..() - if(display_timer) - if(det_time > 1) - to_chat(user, "The timer is set to [det_time/10] second\s.") - else - to_chat(user, "\The [src] is set for instant detonation.") - - -/obj/item/grenade/attack_self(mob/user) - if(!active) - if(clown_check(user)) - preprime(user) - + + +/obj/item/grenade/examine(mob/user) + ..() + if(display_timer) + if(det_time > 1) + to_chat(user, "The timer is set to [det_time/10] second\s.") + else + to_chat(user, "\The [src] is set for instant detonation.") + + +/obj/item/grenade/attack_self(mob/user) + if(!active) + if(clown_check(user)) + preprime(user) + /obj/item/grenade/proc/log_grenade(mob/user, turf/T) var/area/A = get_area(T) var/message = "[ADMIN_LOOKUPFLW(user)]) has primed \a [src] for detonation at [ADMIN_COORDJMP(T)]" @@ -52,57 +52,58 @@ message_admins(message) log_game("[key_name(user)] has primed \a [src] for detonation at [A.name] [COORD(T)].") -/obj/item/grenade/proc/preprime(mob/user, delayoverride, msg = TRUE) +/obj/item/grenade/proc/preprime(mob/user, delayoverride, msg = TRUE, volume = 60) var/turf/T = get_turf(src) - log_grenade(user, T) - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.throw_mode_on() - if(msg) - to_chat(user, "You prime \the [src]! [det_time/10] seconds!") - playsound(loc, 'sound/weapons/armbomb.ogg', 60, 1) - active = TRUE - icon_state = initial(icon_state) + "_active" - add_fingerprint(user) + log_grenade(user, T) //Inbuilt admin procs already handle null users + if(user) + add_fingerprint(user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.throw_mode_on() + if(msg) + to_chat(user, "You prime \the [src]! [det_time/10] seconds!") + playsound(src, 'sound/weapons/armbomb.ogg', volume, 1) + active = TRUE + icon_state = initial(icon_state) + "_active" addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride) - -/obj/item/grenade/proc/prime() - -/obj/item/grenade/proc/update_mob() - if(ismob(loc)) - var/mob/M = loc - M.dropItemToGround(src) - - -/obj/item/grenade/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) - switch(det_time) - if ("1") - det_time = 10 - to_chat(user, "You set the [name] for 1 second detonation time.") - if ("10") - det_time = 30 - to_chat(user, "You set the [name] for 3 second detonation time.") - if ("30") - det_time = 50 - to_chat(user, "You set the [name] for 5 second detonation time.") - if ("50") - det_time = 1 - to_chat(user, "You set the [name] for instant detonation.") - add_fingerprint(user) - else - return ..() - -/obj/item/grenade/attack_hand() - walk(src, null, null) - ..() - -/obj/item/grenade/attack_paw(mob/user) - return attack_hand(user) - -/obj/item/grenade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - var/obj/item/projectile/P = hitby - if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15)) - owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!") - prime() + +/obj/item/grenade/proc/prime() + +/obj/item/grenade/proc/update_mob() + if(ismob(loc)) + var/mob/M = loc + M.dropItemToGround(src) + + +/obj/item/grenade/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/screwdriver)) + switch(det_time) + if ("1") + det_time = 10 + to_chat(user, "You set the [name] for 1 second detonation time.") + if ("10") + det_time = 30 + to_chat(user, "You set the [name] for 3 second detonation time.") + if ("30") + det_time = 50 + to_chat(user, "You set the [name] for 5 second detonation time.") + if ("50") + det_time = 1 + to_chat(user, "You set the [name] for instant detonation.") + add_fingerprint(user) + else + return ..() + +/obj/item/grenade/attack_hand() + walk(src, null, null) + ..() + +/obj/item/grenade/attack_paw(mob/user) + return attack_hand(user) + +/obj/item/grenade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + var/obj/item/projectile/P = hitby + if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15)) + owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!") + prime() return TRUE //It hit the grenade, not them diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index ec5f349ca9..d1d7f4d289 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -7,14 +7,66 @@ w_class = WEIGHT_CLASS_SMALL resistance_flags = FLAMMABLE var/list/squeak_override //Weighted list; If you want your plush to have different squeak sounds use this + var/stuffed = TRUE //If the plushie has stuffing in it + var/obj/item/grenade/grenade //You can remove the stuffing from a plushie and add a grenade to it for *nefarious uses* /obj/item/toy/plush/Initialize() . = ..() AddComponent(/datum/component/squeak, squeak_override) +/obj/item/toy/plush/Destroy() + QDEL_NULL(grenade) + return ..() + +/obj/item/toy/plush/handle_atom_del(atom/A) + if(A == grenade) + grenade = null + ..() + /obj/item/toy/plush/attack_self(mob/user) . = ..() - to_chat(user, "You pet [src]. D'awww.") + if(stuffed || grenade) + to_chat(user, "You pet [src]. D'awww.") + if(grenade && !grenade.active) + if(istype(grenade, /obj/item/grenade/chem_grenade)) + var/obj/item/grenade/chem_grenade/G = grenade + if(G.nadeassembly) //We're activated through different methods + return + log_game("[key_name(user)] activated a hidden grenade in [src].") + grenade.preprime(user, msg = FALSE, volume = 10) + else + to_chat(user, "You try to pet [src], but it has no stuffing. Aww...") + +/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params) + if(I.is_sharp()) + if(!grenade) + if(!stuffed) + to_chat(user, "You already murdered it!") + return + user.visible_message("[user] tears out the stuffing from [src]!", "You rip a bunch of the stuffing from [src]. Murderer.") + playsound(I, I.usesound, 50, TRUE) + stuffed = FALSE + else + to_chat(user, "You remove the grenade from [src].") + user.put_in_hands(grenade) + grenade = null + return + if(istype(I, /obj/item/grenade)) + if(stuffed) + to_chat(user, "You need to remove some stuffing first!") + return + if(grenade) + to_chat(user, "[src] already has a grenade!") + return + if(!user.transferItemToLoc(I, src)) + return + user.visible_message("[user] slides [grenade] into [src].", \ + "You slide [I] into [src].") + grenade = I + var/turf/T = get_turf(user) + log_game("[key_name(user)] added a grenade ([I.name]) to [src] at [COORD(T)].") + return + return ..() /obj/item/toy/plush/carpplushie name = "space carp plushie"