Files
fulpstation/code/game/objects/structures/traps.dm
spookydonut 2591ce17a6 Travis EOF newline detection v3 (#47539)
* scream

* aaa

* aaa

* new one
2019-11-04 19:16:50 -08:00

228 lines
6.7 KiB
Plaintext

/obj/structure/trap
name = "IT'S A TRAP"
desc = "Stepping on me is a guaranteed bad day."
icon = 'icons/obj/hand_of_god_structures.dmi'
icon_state = "trap"
density = FALSE
anchored = TRUE
alpha = 30 //initially quite hidden when not "recharging"
var/flare_message = "<span class='warning'>the trap flares brightly!</span>"
var/last_trigger = 0
var/time_between_triggers = 600 //takes a minute to recharge
var/charges = INFINITY
var/checks_antimagic = TRUE
var/list/static/ignore_typecache
var/list/mob/immune_minds = list()
var/sparks = TRUE
var/datum/effect_system/spark_spread/spark_system
/obj/structure/trap/Initialize(mapload)
. = ..()
flare_message = "<span class='warning'>[src] flares brightly!</span>"
spark_system = new
spark_system.set_up(4,1,src)
spark_system.attach(src)
if(!ignore_typecache)
ignore_typecache = typecacheof(list(
/obj/effect,
/mob/dead))
/obj/structure/trap/Destroy()
qdel(spark_system)
spark_system = null
. = ..()
/obj/structure/trap/examine(mob/user)
. = ..()
if(!isliving(user))
return
if(user.mind && user.mind in immune_minds)
return
if(get_dist(user, src) <= 1)
. += "<span class='notice'>You reveal [src]!</span>"
flare()
/obj/structure/trap/proc/flare()
// Makes the trap visible, and starts the cooldown until it's
// able to be triggered again.
visible_message(flare_message)
if(sparks)
spark_system.start()
alpha = 200
last_trigger = world.time
charges--
if(charges <= 0)
animate(src, alpha = 0, time = 10)
QDEL_IN(src, 10)
else
animate(src, alpha = initial(alpha), time = time_between_triggers)
/obj/structure/trap/Crossed(atom/movable/AM)
if(last_trigger + time_between_triggers > world.time)
return
// Don't want the traps triggered by sparks, ghosts or projectiles.
if(is_type_in_typecache(AM, ignore_typecache))
return
if(ismob(AM))
var/mob/M = AM
if(M.mind in immune_minds)
return
if(checks_antimagic && M.anti_magic_check())
flare()
return
if(charges <= 0)
return
flare()
if(isliving(AM))
trap_effect(AM)
/obj/structure/trap/proc/trap_effect(mob/living/L)
return
/obj/structure/trap/stun
name = "shock trap"
desc = "A trap that will shock and render you immobile. You'd better avoid it."
icon_state = "trap-shock"
var/stun_time = 100
/obj/structure/trap/stun/trap_effect(mob/living/L)
L.electrocute_act(30, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
L.Paralyze(stun_time)
/obj/structure/trap/stun/hunter
name = "bounty trap"
desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it."
icon = 'icons/obj/objects.dmi'
icon_state = "bounty_trap_on"
stun_time = 200
sparks = FALSE //the item version gives them off to prevent runtimes (see Destroy())
checks_antimagic = FALSE
var/obj/item/bountytrap/stored_item
var/caught = FALSE
/obj/structure/trap/stun/hunter/Initialize(mapload)
. = ..()
time_between_triggers = 10
flare_message = "<span class='warning'>[src] snaps shut!</span>"
/obj/structure/trap/stun/hunter/Crossed(atom/movable/AM)
if(isliving(AM))
var/mob/living/L = AM
if(!L.mind?.has_antag_datum(/datum/antagonist/fugitive))
return
caught = TRUE
. = ..()
/obj/structure/trap/stun/hunter/flare()
..()
stored_item.forceMove(get_turf(src))
forceMove(stored_item)
if(caught)
stored_item.announce_fugitive()
caught = FALSE
/obj/item/bountytrap
name = "bounty trap"
desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. It's currently inactive."
icon = 'icons/obj/objects.dmi'
icon_state = "bounty_trap_off"
var/obj/structure/trap/stun/hunter/stored_trap
var/obj/item/radio/radio
var/datum/effect_system/spark_spread/spark_system
/obj/item/bountytrap/Initialize(mapload)
. = ..()
radio = new(src)
radio.subspace_transmission = TRUE
radio.canhear_range = 0
radio.recalculateChannels()
spark_system = new
spark_system.set_up(4,1,src)
spark_system.attach(src)
name = "[name] #[rand(1, 999)]"
stored_trap = new(src)
stored_trap.name = name
stored_trap.stored_item = src
/obj/item/bountytrap/proc/announce_fugitive()
spark_system.start()
playsound(src, 'sound/machines/ding.ogg', 50, TRUE)
radio.talk_into(src, "Fugitive has triggered this trap in the [get_area_name(src)]!", RADIO_CHANNEL_COMMON)
/obj/item/bountytrap/attack_self(mob/living/user)
var/turf/T = get_turf(src)
if(!user || !user.transferItemToLoc(src, T))//visibly unequips
return
to_chat(user, "<span class=notice>You set up [src]. Examine while close to disarm it.</span>")
stored_trap.forceMove(T)//moves trap to ground
forceMove(stored_trap)//moves item into trap
/obj/item/bountytrap/Destroy()
qdel(stored_trap)
QDEL_NULL(radio)
QDEL_NULL(spark_system)
. = ..()
/obj/structure/trap/fire
name = "flame trap"
desc = "A trap that will set you ablaze. You'd better avoid it."
icon_state = "trap-fire"
/obj/structure/trap/fire/trap_effect(mob/living/L)
to_chat(L, "<span class='danger'><B>Spontaneous combustion!</B></span>")
L.Paralyze(20)
new /obj/effect/hotspot(get_turf(src))
/obj/structure/trap/chill
name = "frost trap"
desc = "A trap that will chill you to the bone. You'd better avoid it."
icon_state = "trap-frost"
/obj/structure/trap/chill/trap_effect(mob/living/L)
to_chat(L, "<span class='danger'><B>You're frozen solid!</B></span>")
L.Paralyze(20)
L.adjust_bodytemperature(-300)
L.apply_status_effect(/datum/status_effect/freon)
/obj/structure/trap/damage
name = "earth trap"
desc = "A trap that will summon a small earthquake, just for you. You'd better avoid it."
icon_state = "trap-earth"
/obj/structure/trap/damage/trap_effect(mob/living/L)
to_chat(L, "<span class='danger'><B>The ground quakes beneath your feet!</B></span>")
L.Paralyze(100)
L.adjustBruteLoss(35)
var/obj/structure/flora/rock/giant_rock = new(get_turf(src))
QDEL_IN(giant_rock, 200)
/obj/structure/trap/ward
name = "divine ward"
desc = "A divine barrier, It looks like you could destroy it with enough effort, or wait for it to dissipate..."
icon_state = "ward"
density = TRUE
time_between_triggers = 1200 //Exists for 2 minutes
/obj/structure/trap/ward/Initialize()
. = ..()
QDEL_IN(src, time_between_triggers)
/obj/structure/trap/cult
name = "unholy trap"
desc = "A trap that rings with unholy energy. You think you hear... chittering?"
icon_state = "trap-cult"
/obj/structure/trap/cult/trap_effect(mob/living/L)
to_chat(L, "<span class='danger'><B>With a crack, the hostile constructs come out of hiding, stunning you!</B></span>")
L.electrocute_act(10, src, flags = SHOCK_NOGLOVES) // electrocute act does a message.
L.Paralyze(20)
new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc)
QDEL_IN(src, 30)