From e98649fa5eafa1c922906185e7bf1cbd54e7a3d8 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Mon, 24 Nov 2014 10:52:08 +0100 Subject: [PATCH] Plastique wiring. --- baystation12.dme | 2 + code/__HELPERS/turfs.dm | 7 ++ code/datums/wires/explosive.dm | 31 ++++++ code/defines/obj/weapon.dm | 13 --- code/game/objects/items/weapons/explosives.dm | 99 +++++++++++++------ 5 files changed, 110 insertions(+), 42 deletions(-) create mode 100644 code/__HELPERS/turfs.dm create mode 100644 code/datums/wires/explosive.dm diff --git a/baystation12.dme b/baystation12.dme index 83dfe89d6a..c97ff01881 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -28,6 +28,7 @@ #include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" +#include "code\__HELPERS\turfs.dm" #include "code\__HELPERS\type2type.dm" #include "code\__HELPERS\unsorted.dm" #include "code\_onclick\adjacent.dm" @@ -169,6 +170,7 @@ #include "code\datums\wires\apc.dm" #include "code\datums\wires\autolathe.dm" #include "code\datums\wires\camera.dm" +#include "code\datums\wires\explosive.dm" #include "code\datums\wires\mulebot.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\radio.dm" diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm new file mode 100644 index 0000000000..57d4b86555 --- /dev/null +++ b/code/__HELPERS/turfs.dm @@ -0,0 +1,7 @@ +// Returns the atom sitting on the turf. +// For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. +/proc/get_atom_on_turf(var/atom/movable/M) + var/atom/mloc = M + while(mloc && mloc.loc && !istype(mloc.loc, /turf/)) + mloc = mloc.loc + return mloc diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm new file mode 100644 index 0000000000..6dc8e988ac --- /dev/null +++ b/code/datums/wires/explosive.dm @@ -0,0 +1,31 @@ +/datum/wires/explosive + wire_count = 1 + +var/const/WIRE_EXPLODE = 1 + +/datum/wires/explosive/proc/explode() + return + +/datum/wires/explosive/UpdatePulsed(var/index) + switch(index) + if(WIRE_EXPLODE) + explode() + +/datum/wires/explosive/UpdateCut(var/index, var/mended) + switch(index) + if(WIRE_EXPLODE) + if(!mended) + explode() + +/datum/wires/explosive/c4 + holder_type = /obj/item/weapon/plastique + +/datum/wires/explosive/c4/CanUse(var/mob/living/L) + var/obj/item/weapon/plastique/P = holder + if(P.open_panel) + return 1 + return 0 + +/datum/wires/explosive/c4/explode() + var/obj/item/weapon/plastique/P = holder + P.explode(get_turf(P)) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index ae3adf9c3b..6de75c2b9d 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -433,19 +433,6 @@ var/obj/machinery/machine -/obj/item/weapon/plastique - name = "plastic explosives" - desc = "Used to put holes in specific areas without too much extra hole." - gender = PLURAL - icon = 'icons/obj/assemblies.dmi' - icon_state = "plastic-explosive0" - item_state = "plasticx" - flags = FPRINT | TABLEPASS | NOBLUDGEON - w_class = 2.0 - origin_tech = "syndicate=2" - var/timer = 10 - var/atom/target = null - ///////////////////////////////////////Stock Parts ///////////////////////////////// /obj/item/weapon/stock_parts diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index d9a72058ae..97e5630d94 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -1,45 +1,86 @@ +/obj/item/weapon/plastique + name = "plastic explosives" + desc = "Used to put holes in specific areas without too much extra hole." + gender = PLURAL + icon = 'icons/obj/assemblies.dmi' + icon_state = "plastic-explosive0" + item_state = "plasticx" + flags = FPRINT | TABLEPASS | NOBLUDGEON + w_class = 2.0 + origin_tech = "syndicate=2" + var/datum/wires/explosive/c4/wires = null + var/timer = 10 + var/atom/target = null + var/open_panel = 0 + var/image_overlay = null + +/obj/item/weapon/plastique/New() + wires = new(src) + image_overlay = image('icons/obj/assemblies.dmi', "plastic-explosive2") + ..() + +/obj/item/weapon/plastique/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/weapon/screwdriver)) + open_panel = !open_panel + user << "You [open_panel ? "open" : "close"] the wire panel." + else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler )) + wires.Interact(user) + else + ..() + /obj/item/weapon/plastique/attack_self(mob/user as mob) var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num - if(newtime < 10) - newtime = 10 - timer = newtime - user << "Timer set for [timer] seconds." + if(user.get_active_hand() == src) + newtime = Clamp(newtime, 10, 60000) + timer = newtime + user << "Timer set for [timer] seconds." -/obj/item/weapon/plastique/afterattack(atom/target as obj|turf, mob/user as mob, flag) +/obj/item/weapon/plastique/afterattack(atom/movable/target, mob/user, flag) if (!flag) return - if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/)) + if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage/)) return user << "Planting explosives..." - if(ismob(target)) - - user.attack_log += "\[[time_stamp()]\] [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])" - msg_admin_attack("[user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey]) (JMP)") - - user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!") if(do_after(user, 50) && in_range(user, target)) user.drop_item() - target = target + src.target = target loc = null - var/location - if (isturf(target)) location = target - if (isobj(target)) location = target.loc + if (ismob(target)) - target:attack_log += "\[[time_stamp()]\] Had the [name] planted on them by [user.real_name] ([user.ckey])" - user.visible_message("\red [user.name] finished planting an explosive on [target.name]!") - target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2") + add_logs(user, target, "planted [name] on") + user.visible_message("[user.name] finished planting an explosive on [target.name]!") + message_admins("[key_name(user, user.client)](?) planted [src.name] on [key_name(target)](?) with [timer] second fuse",0,1) + log_game("[key_name(user)] planted [src.name] on [key_name(target)] with [timer] second fuse") + + else + message_admins("[key_name(user, user.client)](?) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [timer] second fuse",0,1) + log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") + + target.overlays += image_overlay user << "Bomb has been planted. Timer counting down from [timer]." spawn(timer*10) - if(target) - explosion(location, -1, -1, 2, 3) - if (istype(target, /turf/simulated/wall)) target:dismantle_wall(1) - else target.ex_act(1) - if (isobj(target)) - if (target) - del(target) - if (src) - del(src) + explode(get_turf(target)) + +/obj/item/weapon/plastique/proc/explode(var/location) + if(!target) + target = get_atom_on_turf(src) + if(!target) + target = src + if(location) + explosion(location, -1, -1, 2, 3) + + if(target) + if (istype(target, /turf/simulated/wall)) + var/turf/simulated/wall/W = target + W.dismantle_wall(1) + else if(istype(target, /mob/living)) + target.ex_act(2) // c4 can't gib mobs anymore. + else + target.ex_act(1) + if(target) + target.overlays -= image_overlay + del(src) // qdel /obj/item/weapon/plastique/attack(mob/M as mob, mob/user as mob, def_zone) - return \ No newline at end of file + return