From fa6ff944744649ea4615f1155cad3b002010b7d6 Mon Sep 17 00:00:00 2001 From: mistyLuminescence <32139558+mistyLuminescence@users.noreply.github.com> Date: Sat, 10 Feb 2018 02:56:46 +0000 Subject: [PATCH] What's Yours Is Mined (#4556) * Boom! * Wires! --- code/datums/wires/mines.dm | 81 +++++++ code/game/objects/effects/mines.dm | 240 ++++++++++++++++---- html/changelogs/MistyLuminescence-mines.yml | 36 +++ polaris.dme | 1 + 4 files changed, 314 insertions(+), 44 deletions(-) create mode 100644 code/datums/wires/mines.dm create mode 100644 html/changelogs/MistyLuminescence-mines.yml diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm new file mode 100644 index 00000000000..2d0aecaaf03 --- /dev/null +++ b/code/datums/wires/mines.dm @@ -0,0 +1,81 @@ +/datum/wires/mines + wire_count = 6 + random = 1 + holder_type = /obj/effect/mine + +#define WIRE_DETONATE 1 +#define WIRE_TIMED_DET 2 +#define WIRE_DISARM 4 +#define WIRE_DUMMY_1 8 +#define WIRE_DUMMY_2 16 +#define WIRE_BADDISARM 32 + +/datum/wires/mines/GetInteractWindow() + . = ..() + . += "
\n["Warning: detonation may occur even with proper equipment."]" + return . + +/datum/wires/mines/proc/explode() + return + +/datum/wires/mines/UpdateCut(var/index, var/mended) + var/obj/effect/mine/C = holder + + switch(index) + if(WIRE_DETONATE) + C.visible_message("\icon[C] *BEEE-*", "\icon[C] *BEEE-*") + C.explode() + + if(WIRE_TIMED_DET) + C.visible_message("\icon[C] *BEEE-*", "\icon[C] *BEEE-*") + C.explode() + + if(WIRE_DISARM) + C.visible_message("\icon[C] *click!*", "\icon[C] *click!*") + new C.mineitemtype(get_turf(C)) + spawn(0) + qdel(C) + return + + if(WIRE_DUMMY_1) + return + + + if(WIRE_DUMMY_2) + return + + if(WIRE_BADDISARM) + C.visible_message("\icon[C] *BEEPBEEPBEEP*", "\icon[C] *BEEPBEEPBEEP*") + spawn(20) + C.explode() + return + +/datum/wires/mines/UpdatePulsed(var/index) + var/obj/effect/mine/C = holder + if(IsIndexCut(index)) + return + switch(index) + if(WIRE_DETONATE) + C.visible_message("\icon[C] *beep*", "\icon[C] *beep*") + + if(WIRE_TIMED_DET) + C.visible_message("\icon[C] *BEEPBEEPBEEP*", "\icon[C] *BEEPBEEPBEEP*") + spawn(20) + C.explode() + + if(WIRE_DISARM) + C.visible_message("\icon[C] *ping*", "\icon[C] *ping*") + + if(WIRE_DUMMY_1) + C.visible_message("\icon[C] *ping*", "\icon[C] *ping*") + + if(WIRE_DUMMY_2) + C.visible_message("\icon[C] *beep*", "\icon[C] *beep*") + + if(WIRE_BADDISARM) + C.visible_message("\icon[C] *ping*", "\icon[C] *ping*") + return + +/datum/wires/mines/CanUse(var/mob/living/L) + var/obj/effect/mine/M = holder + return M.panel_open diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 52f920775eb..0ab0bd6126f 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -1,16 +1,37 @@ /obj/effect/mine - name = "Mine" - desc = "I Better stay away from that thing." - density = 1 + name = "mine" + desc = "A small explosive mine with 'HE' and a grenade symbol on the side." + density = 0 anchored = 1 - layer = 3 icon = 'icons/obj/weapons.dmi' icon_state = "uglymine" - var/triggerproc = "explode" //name of the proc thats called when the mine is triggered var/triggered = 0 + var/smoke_strength = 3 + var/mineitemtype = /obj/item/weapon/mine + var/panel_open = 0 + var/datum/wires/mines/wires = null /obj/effect/mine/New() icon_state = "uglyminearmed" + wires = new(src) + +/obj/effect/mine/proc/explode() + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + triggered = 1 + s.set_up(3, 1, src) + s.start() + explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks. + qdel(s) + qdel(src) + +/obj/effect/mine/bullet_act() + if(prob(50)) + explode() + +/obj/effect/mine/ex_act(severity) + if(severity <= 2 || prob(50)) + explode() + ..() /obj/effect/mine/Crossed(AM as mob|obj) Bumped(AM) @@ -19,87 +40,218 @@ if(triggered) return - if(istype(M, /mob/living/carbon/human)) - for(var/mob/O in viewers(world.view, src.loc)) - O << "[M] triggered the \icon[src] [src]" - triggered = 1 - call(src,triggerproc)(M) + if(istype(M, /mob/living/)) + explode() -/obj/effect/mine/proc/triggerrad(obj) +/obj/effect/mine/attackby(obj/item/W as obj, mob/living/user as mob) + if(isscrewdriver(W)) + panel_open = !panel_open + user.visible_message("[user] very carefully screws the mine's panel [panel_open ? "open" : "closed"].", + "You very carefully screw the mine's panel [panel_open ? "open" : "closed"].") + playsound(src.loc, W.usesound, 50, 1) + + else if((iswirecutter(W) || ismultitool(W)) && panel_open) + interact(user) + else + ..() + +/obj/effect/mine/interact(mob/living/user as mob) + if(!panel_open || istype(user, /mob/living/silicon/ai)) + return + + user.set_machine(src) + wires.Interact(user) + +/obj/effect/mine/dnascramble/explode(obj) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + triggered = 1 s.set_up(3, 1, src) s.start() obj:radiation += 50 randmutb(obj) domutcheck(obj,null) - spawn(0) - qdel(src) + qdel(s) + qdel(src) -/obj/effect/mine/proc/triggerstun(obj) +/obj/effect/mine/stun/explode(obj) + triggered = 1 if(ismob(obj)) var/mob/M = obj M.Stun(30) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(3, 1, src) s.start() - spawn(0) - qdel(src) - -/obj/effect/mine/proc/triggern2o(obj) - //example: n2o triggerproc - //note: im lazy + qdel(s) + qdel(src) +/obj/effect/mine/n2o/explode() + triggered = 1 for (var/turf/simulated/floor/target in range(1,src)) if(!target.blocks_air) target.assume_gas("sleeping_agent", 30) + qdel(src) - spawn(0) - qdel(src) - -/obj/effect/mine/proc/triggerphoron(obj) +/obj/effect/mine/phoron/explode() + triggered = 1 for (var/turf/simulated/floor/target in range(1,src)) if(!target.blocks_air) target.assume_gas("phoron", 30) target.hotspot_expose(1000, CELL_VOLUME) + qdel(src) - spawn(0) - qdel(src) - -/obj/effect/mine/proc/triggerkick(obj) +/obj/effect/mine/kick/explode(obj) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + triggered = 1 s.set_up(3, 1, src) s.start() qdel(obj:client) - spawn(0) - qdel(src) + qdel(s) + qdel(src) -/obj/effect/mine/proc/explode(obj) - explosion(loc, 0, 1, 2, 3) - spawn(0) - qdel(src) +/obj/effect/mine/frag/explode() + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + triggered = 1 + s.set_up(3, 1, src) + s.start() + var/turf/O = get_turf(src) + if(!O) + return + src.fragmentate(O, 20, 7, list(/obj/item/projectile/bullet/pellet/fragment)) //only 20 weak fragments because you're stepping directly on it + qdel(s) + qdel(src) + +/obj/effect/mine/training/explode() + triggered = 1 + visible_message("\The [src.name]'s light flashes rapidly as it 'explodes'.") + new src.mineitemtype(get_turf(src)) + qdel(src) /obj/effect/mine/dnascramble - name = "Radiation Mine" + name = "radiation mine" + desc = "A small explosive mine with a radiation symbol on the side." icon_state = "uglymine" - triggerproc = "triggerrad" + mineitemtype = /obj/item/weapon/mine/dnascramble /obj/effect/mine/phoron - name = "Phoron Mine" + name = "incendiary mine" + desc = "A small explosive mine with a fire symbol on the side." icon_state = "uglymine" - triggerproc = "triggerphoron" + mineitemtype = /obj/item/weapon/mine/phoron /obj/effect/mine/kick - name = "Kick Mine" + name = "kick mine" + desc = "Concentrated war crimes. Handle with care." icon_state = "uglymine" - triggerproc = "triggerkick" + mineitemtype = /obj/item/weapon/mine/kick /obj/effect/mine/n2o - name = "N2O Mine" + name = "nitrous oxide mine" + desc = "A small explosive mine with three Z's on the side." icon_state = "uglymine" - triggerproc = "triggern2o" + mineitemtype = /obj/item/weapon/mine/n2o /obj/effect/mine/stun - name = "Stun Mine" + name = "stun mine" + desc = "A small explosive mine with a lightning bolt symbol on the side." icon_state = "uglymine" - triggerproc = "triggerstun" + mineitemtype = /obj/item/weapon/mine/stun + +/obj/effect/mine/frag + name = "fragmentation mine" + desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side." + icon_state = "uglymine" + mineitemtype = /obj/item/weapon/mine/frag + var/fragment_types = list(/obj/item/projectile/bullet/pellet/fragment) + var/num_fragments = 20 //total number of fragments produced by the grenade + //The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern + var/spread_range = 7 + +/obj/effect/mine/training + name = "training mine" + desc = "A mine with its payload removed, for EOD training and demonstrations." + icon_state = "uglymine" + mineitemtype = /obj/item/weapon/mine/training + +/obj/item/weapon/mine + name = "mine" + desc = "A small explosive mine with 'HE' and a grenade symbol on the side." + icon = 'icons/obj/weapons.dmi' + icon_state = "uglymine" + var/arming = 0 + var/countdown = 10 + var/minetype = /obj/effect/mine + +/obj/item/weapon/mine/attack_self(mob/user as mob) + if(!arming) + to_chat(user, "You prime \the [name]! [countdown] seconds!") + icon_state = initial(icon_state) + "armed" + arming = 1 + playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + add_fingerprint(user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.throw_mode_on() + spawn(countdown*10) + if(arming) + prime() + if(user) + msg_admin_attack("[user.name] ([user.ckey]) primed \a [src] (JMP)") + return + else + to_chat(user, "You cancel \the [name]'s priming sequence.") + arming = 0 + countdown = initial(countdown) + icon_state = initial(icon_state) + add_fingerprint(user) + return + +/obj/item/weapon/mine/proc/prime(mob/user as mob) + visible_message("\The [src.name] beeps as the priming sequence completes.") + var/atom/R = new minetype(get_turf(src)) + src.transfer_fingerprints_to(R) + R.add_fingerprint(user) + spawn(0) + qdel(src) + +/obj/item/weapon/mine/dnascramble + name = "radiation mine" + desc = "A small explosive mine with a radiation symbol on the side." + icon_state = "uglymine" + minetype = /obj/effect/mine/dnascramble + +/obj/item/weapon/mine/phoron + name = "incendiary mine" + desc = "A small explosive mine with a fire symbol on the side." + icon_state = "uglymine" + minetype = /obj/effect/mine/phoron + +/obj/item/weapon/mine/kick + name = "kick mine" + desc = "Concentrated war crimes. Handle with care." + icon_state = "uglymine" + minetype = /obj/effect/mine/kick + +/obj/item/weapon/mine/n2o + name = "nitrous oxide mine" + desc = "A small explosive mine with three Z's on the side." + icon_state = "uglymine" + minetype = /obj/effect/mine/n2o + +/obj/item/weapon/mine/stun + name = "stun mine" + desc = "A small explosive mine with a lightning bolt symbol on the side." + icon_state = "uglymine" + minetype = /obj/effect/mine/stun + +/obj/item/weapon/mine/frag + name = "fragmentation mine" + desc = "A small explosive mine with 'FRAG' and a grenade symbol on the side." + icon_state = "uglymine" + minetype = /obj/effect/mine/frag + +/obj/item/weapon/mine/training + name = "training mine" + desc = "A mine with its payload removed, for EOD training and demonstrations." + icon_state = "uglymine" + minetype = /obj/effect/mine/training \ No newline at end of file diff --git a/html/changelogs/MistyLuminescence-mines.yml b/html/changelogs/MistyLuminescence-mines.yml new file mode 100644 index 00000000000..3354ccf6067 --- /dev/null +++ b/html/changelogs/MistyLuminescence-mines.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: MistyLuminescence + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Mines are now very, /very/ dangerous to step on (so don't do that). You can disarm them with a multitool and wirecutters - ping is good, beep is bad - or by shooting or exploding them from a distance. Be careful!" diff --git a/polaris.dme b/polaris.dme index 81502edfc1e..50b32435f00 100644 --- a/polaris.dme +++ b/polaris.dme @@ -315,6 +315,7 @@ #include "code\datums\wires\explosive.dm" #include "code\datums\wires\grid_checker.dm" #include "code\datums\wires\jukebox.dm" +#include "code\datums\wires\mines.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\radio.dm" #include "code\datums\wires\robot.dm"