From 3f51d1135a84bc07d54a7395c6ab19f15f99c832 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 24 Mar 2015 09:10:10 -0400 Subject: [PATCH] Re-adds old IED recipe, allows IED -> Beartraps --- code/defines/obj/weapon.dm | 90 ++++++++++++++----- .../items/weapons/grenades/ghettobomb.dm | 84 ++++++++++++++++- code/modules/crafting/recipes.dm | 2 +- 3 files changed, 147 insertions(+), 29 deletions(-) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index c00ba0f9061..3c3bb7ac977 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -172,6 +172,7 @@ icon_state = "beartrap0" desc = "A trap used to catch bears and other legged creatures." var/armed = 0 + var/obj/item/weapon/grenade/iedcasing/IED = null suicide_act(mob/user) viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide." @@ -184,33 +185,74 @@ icon_state = "beartrap[armed]" user << "[src] is now [armed ? "armed" : "disarmed"]" - -/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj) - if(armed && isturf(src.loc)) - if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) - var/mob/living/L = AM - armed = 0 - icon_state = "beartrap0" - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - L.visible_message("[L] triggers \the [src].", \ - "You trigger \the [src]!") - - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(H.lying) - H.apply_damage(20,BRUTE,"chest") - else - H.apply_damage(20,BRUTE,(pick("l_leg", "r_leg"))) - if(!H.legcuffed) //beartrap can't cuff you leg if there's already a beartrap or legcuffs. - H.legcuffed = src - src.loc = H - H.update_inv_legcuffed(0) - feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. - +/obj/item/weapon/legcuffs/beartrap/attackby(var/obj/item/I, mob/user as mob) //Let's get explosive. + if(istype(I, /obj/item/weapon/grenade/iedcasing)) + if(IED) + user << "This beartrap already has an IED hooked up to it!" + return + IED = I + switch(IED.assembled) + if(0,1) //if it's not fueled/hooked up + user << "You haven't prepared this IED yet!" + IED = null + return + if(2,3) + user.drop_item(src) + I.loc = src + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + var/log_str = "[key_name(usr)]? has rigged a beartrap with an IED at [A.name] (JMP)." + message_admins(log_str) + log_game(log_str) + user << "You sneak the [IED] underneath the pressure plate and connect the trigger wire." + desc = "A trap used to catch bears and other legged creatures. There is an IED hooked up to it." else - L.apply_damage(20,BRUTE) + user << "You shouldn't be reading this message! Contact a coder or someone, something broke!" + IED = null + return + if(istype(I, /obj/item/weapon/screwdriver)) + if(IED) + IED.loc = get_turf(src.loc) + IED = null + user << "You remove the IED from the [src]." + return ..() +/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj) + if(armed) + if(IED && isturf(src.loc)) + IED.active = 1 + IED.overlays -= image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") + IED.icon_state = initial(icon_state) + "_active" + IED.assembled = 3 + var/turf/bombturf = get_turf(src) + var/area/A = get_area(bombturf) + var/log_str = "[key_name(usr)]? has triggered an IED-rigged [name] at [A.name] (JMP)." + message_admins(log_str) + log_game(log_str) + spawn(IED.det_time) + IED.prime() + if(ishuman(AM)) + if(isturf(src.loc)) + var/mob/living/carbon/H = AM + if(H.m_intent == "run") + armed = 0 + H.legcuffed = src + src.loc = H + H.update_inv_legcuffed() + H << "You step on \the [src]!" + if(IED && IED.active) + H << "The [src]'s IED has been activated!" + feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart. + for(var/mob/O in viewers(H, null)) + if(O == H) + continue + O.show_message("\red [H] steps on \the [src].", 1) + if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) + armed = 0 + var/mob/living/simple_animal/SA = AM + SA.health -= 20 + ..() /obj/item/weapon/holosign_creator name = "holographic sign projector" diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index aad334e45b8..d8441187a5a 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -1,6 +1,70 @@ //improvised explosives// +//iedcasing assembly crafting// +/obj/item/weapon/reagent_containers/food/drinks/cans/attackby(var/obj/item/I, mob/user as mob) + if(istype(I, /obj/item/device/assembly/igniter)) + var/obj/item/device/assembly/igniter/G = I + var/obj/item/weapon/grenade/iedcasing/W = new /obj/item/weapon/grenade/iedcasing + user.unEquip(G) + user.unEquip(src) + user.put_in_hands(W) + user << "You stuff the [I] in the [src], emptying the contents beforehand." + W.underlays += image(src.icon, icon_state = src.icon_state) + del(I) + del(src) + + /obj/item/weapon/grenade/iedcasing + name = "improvised explosive assembly" + desc = "An igniter stuffed into an aluminum shell." + w_class = 2.0 + icon = 'icons/obj/grenade.dmi' + icon_state = "improvised_grenade" + item_state = "flashbang" + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + slot_flags = SLOT_BELT + var/assembled = 0 + active = 1 + det_time = 50 + display_timer = 0 + var/range = 3 + var/times = list() + + + +/obj/item/weapon/grenade/iedcasing/afterattack(atom/target, mob/user , flag) //Filling up the can + if(assembled == 0) + if( istype(target, /obj/structure/reagent_dispensers/fueltank)) + if(target.reagents.total_volume < 50) + user << "There's not enough fuel left to work with." + return + var/obj/structure/reagent_dispensers/fueltank/F = target + F.reagents.remove_reagent("fuel", 50, 1)//Deleting 50 fuel from the welding fuel tank, + assembled = 1 + user << "You've filled the makeshift explosive with welding fuel." + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + desc = "An improvised explosive assembly. Filled to the brim with 'Explosive flavor'" + overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") + return + + +/obj/item/weapon/grenade/iedcasing/attackby(var/obj/item/I, mob/user as mob) //Wiring the can for ignition + if(istype(I, /obj/item/stack/cable_coil)) + if(assembled == 1) + var/obj/item/stack/cable_coil/C = I + C.use(1) + assembled = 2 + user << "You wire the igniter to detonate the fuel." + desc = "A weak, improvised explosive." + overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") + name = "improvised explosive" + active = 0 + det_time = rand(30,80) + + +/obj/item/weapon/grenade/iedcasing/filled name = "improvised firebomb" desc = "A weak, improvised incendiary device." w_class = 2.0 @@ -13,11 +77,11 @@ slot_flags = SLOT_BELT active = 0 det_time = 50 - display_timer = 0 - var/range = 3 - var/times = list() + assembled = 2 -/obj/item/weapon/grenade/iedcasing/New(loc) + + +/obj/item/weapon/grenade/iedcasing/filled/New(loc) ..() overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_filled") overlays += image('icons/obj/grenade.dmi', icon_state = "improvised_grenade_wired") @@ -57,6 +121,18 @@ /obj/item/weapon/grenade/iedcasing/prime() //Blowing that can up update_mob() explosion(src.loc,0,0,2,2) //explosion(src.loc,-1,-1,-1, flame_range = range) + if(istype(loc, /obj/item/weapon/legcuffs/beartrap)) + var/obj/item/weapon/legcuffs/beartrap/boomtrap = loc + if(istype(boomtrap.loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc.loc + if(H.legcuffed) + var/datum/organ/external/l = H.get_organ("l_leg") + var/datum/organ/external/r = H.get_organ("r_leg") + if(l && !(l.status & ORGAN_DESTROYED)) + l.status |= ORGAN_DESTROYED + if(r && !(r.status & ORGAN_DESTROYED)) + r.status |= ORGAN_DESTROYED + qdel(H.legcuffed) qdel(src) /obj/item/weapon/grenade/iedcasing/examine(mob/user) diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index dd90a185926..337c1e1115f 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -10,7 +10,7 @@ /datum/table_recipe/IED name = "IED" - result = /obj/item/weapon/grenade/iedcasing + result = /obj/item/weapon/grenade/iedcasing/filled reqs = list(/datum/reagent/fuel = 50, /obj/item/stack/cable_coil = 1, /obj/item/device/assembly/igniter = 1,