Files
2020-02-16 19:40:21 -08:00

296 lines
6.9 KiB
Plaintext

// Cleaned up the ancient code that used to be here (Convair880).
/obj/item/mine
name = "land mine (parent)"
desc = "You shouldn't be able to see this!"
w_class = 3
density = 0
anchored = 1
layer = OBJ_LAYER
icon = 'icons/obj/weapons.dmi'
icon_state = "mine"
is_syndicate = 1
mats = 6
event_handler_flags = USE_HASENTERED | USE_FLUID_ENTER
var/suppress_flavourtext = 0
var/armed = 0
var/used_up = 0
var/obj/item/device/timer/our_timer = null
New()
..()
if (src.armed)
src.update_icon()
if (!src.our_timer || !istype(src.our_timer))
src.our_timer = new /obj/item/device/timer(src)
src.our_timer.master = src
return
examine()
..()
if (src.suppress_flavourtext != 1)
boutput(usr, "It appears to be [src.armed == 1 ? "armed" : "disarmed"].")
return
attack_hand(mob/user as mob)
src.add_fingerprint(user)
if (prob(50) && src.armed && src.used_up != 1)
if (src.suppress_flavourtext != 1)
src.visible_message("<font color='red'><b>[user] fumbles with the [src.name], accidentally setting it off!</b></span>")
src.triggered(user)
return
..()
return
attackby(obj/item/W as obj, mob/user as mob)
if (prob(50) && src.armed && src.used_up != 1)
if (src.suppress_flavourtext != 1)
src.visible_message("<font color='red'><b>[user] fumbles with the [src.name], accidentally setting it off!</b></span>")
src.triggered(user)
return
..()
return
attack_self(mob/user as mob)
src.add_fingerprint(user)
if (src.used_up != 0)
user.show_text("The [src.name] has already been triggered and is no longer functional.", "red")
return
if (src.armed)
src.armed = 0
src.update_icon()
user.show_text("You disarm the [src.name].", "blue")
logTheThing("bombing", user, null, "has disarmed the [src.name] at [log_loc(user)].")
if (src.our_timer && istype(src.our_timer))
src.our_timer.attack_self(user)
return
receive_signal()
if (src.used_up != 0)
return
playsound(src.loc, "sound/weapons/armbomb.ogg", 100, 1)
src.armed = 1
src.update_icon()
return
// Timer process() expects this to be here. Could be used for dynamic icon_states updates.
proc/c_state()
return
ex_act(severity)
if (src.used_up != 0 || !src.armed)
return
if (src.suppress_flavourtext != 1)
src.visible_message("<font color='red'><b>The explosion sets off the [src.name]!</b></span>")
src.triggered()
return
emp_act()
if (src.used_up != 0 || !src.armed)
return
if (src.suppress_flavourtext != 1)
src.visible_message("<font color='red'><b>The electromagnetic pulse sets off the [src.name]!</b></span>")
src.triggered()
return
emag_act(var/mob/user, var/obj/item/card/emag/E)
if (src.used_up != 0 || !src.armed)
return 0
if (src.suppress_flavourtext != 1)
src.visible_message("<font color='red'><b>The electric charge sets off the [src.name]!</b></span>")
src.triggered(user)
return 1
HasEntered(AM as mob|obj)
if (AM == src || !(istype(AM, /obj/vehicle) || istype(AM, /obj/machinery/bot) || ismob(AM)))
return
if (ismob(AM) && (!isliving(AM) || isintangible(AM) || iswraith(AM)))
return
if (src.used_up != 0)
return
if (!src.armed)
return
if (src.suppress_flavourtext != 1)
src.visible_message("<font color='red'><b>[AM] triggers the [src.name]!</b></span>")
src.triggered(AM)
return
proc/update_icon()
if (!src || !istype(src))
return
if (src.armed)
src.icon_state = "mine_armed"
else
src.icon_state = "mine"
return
// Special effects handled by every type of mine.
proc/custom_stuff(var/atom/M)
return
proc/triggered(var/atom/M)
if (!src || !istype(src))
return
if (src.used_up != 0)
qdel(src)
return
src.used_up = 1
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
s.set_up(3, 1, src)
s.start()
src.custom_stuff(M)
src.log_me(M)
qdel(src)
return
// For bioeffects or stuns, basically everything that should affect all mobs located on src.loc when triggered.
proc/get_mobs_on_turf(var/radius = 0)
var/list/mobs = list()
if (!src || !istype(src))
return mobs
var/turf/T = get_turf(src)
if (T && istype(T))
for (var/mob/living/L in T.contents)
if (!istype(L) || isintangible(L) || iswraith(L))
continue
if (!(L in mobs))
mobs.Add(L)
if (radius > 0)
for (var/mob/living/L2 in range(src, radius))
if (!istype(L2) || isintangible(L2) || iswraith(L2))
continue
if (!(L2 in mobs))
mobs.Add(L2)
return mobs
proc/log_me(var/atom/M, var/mob/T)
if (!src || !istype(src))
return
logTheThing("bombing", M && ismob(M) ? M : null, T && ismob(T) ? T : null, "The [src.name] was triggered at [log_loc(src)][T && ismob(T) ? ", affecting %target%." : "."] Last touched by: [src.fingerprintslast ? "[src.fingerprintslast]" : "*null*"]")
return
/obj/item/mine/radiation
name = "land mine (radiation)"
desc = "An anti-personnel mine."
armed
armed = 1
custom_stuff(var/atom/M)
if (!src || !istype(src))
return
var/list/mobs = src.get_mobs_on_turf()
if (M && isliving(M) && !(M in mobs))
mobs.Add(M)
if (mobs.len)
for (var/mob/living/L in mobs)
if (istype(L))
L.changeStatus("radiation", 800)
if (L.bioHolder && ishuman(L))
L.bioHolder.RandomEffect("bad")
if (L != M)
src.log_me(null, L)
playsound(src.loc, 'sound/weapons/ACgun2.ogg', 50, 1)
return
/obj/item/mine/incendiary
name = "land mine (incendiary)"
desc = "An anti-personnel mine."
armed
armed = 1
custom_stuff(var/atom/M)
if (!src || !istype(src))
return
fireflash_sm(get_turf(src), 3, 3000, 500)
playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1)
return
/obj/item/mine/stun
name = "land mine (stun)"
desc = "An anti-personnel mine."
armed
armed = 1
custom_stuff(var/atom/M)
if (!src || !istype(src))
return
var/list/mobs = src.get_mobs_on_turf(1)
if (M && isliving(M) && !(M in mobs))
mobs.Add(M)
if (mobs.len)
for (var/mob/living/L in mobs)
if (istype(L))
L.changeStatus("weakened", 150)
L.stuttering += 15
if (L != M)
src.log_me(null, L)
playsound(src.loc, 'sound/weapons/flashbang.ogg', 50, 1)
return
/obj/item/mine/blast
name = "land mine (blast)"
desc = "An anti-personnel mine."
armed
armed = 1
custom_stuff(var/atom/M)
if (!src || !istype(src))
return
explosion(src, src.loc, 0, 1, 2, 3)
return
/obj/item/mine/gibs
name = "pustule"
desc = "Some kind of weird little meat balloon."
icon = 'icons/misc/meatland.dmi'
icon_state = "meatmine"
suppress_flavourtext = 1
is_syndicate = 0
mats = 0
armed
armed = 1
update_icon()
return
custom_stuff(var/atom/M)
if (!src || !istype(src))
return
src.visible_message("<span style=\"color:red\">[src] bursts[pick(" like an overripe melon!", " like an impacted bowel!", " like a balloon filled with blood!", "!", "!")]</span>")
gibs(src.loc)
playsound(src.loc, "sound/impact_sounds/Flesh_Break_1.ogg", 50, 1)
return