Files
2026-07-08 04:50:46 -04:00

133 lines
4.6 KiB
Plaintext

/obj/structure/spring_trap
name = "spring trap"
gender = PLURAL
layer = 2.6
anchored = TRUE
var/sprung = TRUE
var/distance = 3
var/max_distance = 10
var/reset_time = 15 SECONDS
icon = 'icons/obj/items.dmi'
icon_state = "spring_trap"
/obj/structure/spring_trap/start_active
sprung = FALSE
/obj/structure/spring_trap/attackby(obj/item/W, mob/user, attack_modifier, click_parameters)
if(W.has_tool_quality(TOOL_WRENCH))
playsound(src, W.usesound, 50, TRUE)
if(do_after(user, 10 SECONDS, target = src))
user.visible_message(span_danger("[user] has disassembled \the [src]."), span_notice("You disassemble \the [src]."))
sprung = TRUE
new /obj/item/spring_trap_kit(get_turf(src))
qdel(src)
else if(!sprung)
trigger(user, TRUE)
return
if(W.has_tool_quality(TOOL_SCREWDRIVER))
playsound(src, W.usesound, 50, TRUE)
if(do_after(user, 10 SECONDS, target = src))
user.visible_message(span_danger("[user] starts adjusting the spring in \the [src]"), span_notice("You adjust the spring in \the [src]"))
distance = tgui_input_number(user, "Pick distance", "distance", min_value = 1, max_value = max_distance)
return
if(W.has_tool_quality(TOOL_CROWBAR))
playsound(src, W.usesound, 50, TRUE)
if(do_after(user, 10 SECONDS, target = src))
user.visible_message(span_danger("[user] starts adjusting the spring in \the [src]"), span_notice("You adjust the spring in \the [src]"))
var/temp_dir = tgui_input_list(user, "Pick direction", "direction", list("north", "south", "east", "west"), SOUTH)
dir = text2dir(temp_dir)
return
. = ..()
/obj/structure/spring_trap/attack_hand(mob/user)
if(!sprung)
user.visible_message(
span_danger("[user] starts to disarm \the [src]."),span_notice("You begin disarming \the [src]."), "You hear the slow creaking of a spring.")
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
if(do_after(user, 10 SECONDS, target = src))
user.visible_message(span_danger("[user] has disarmed \the [src]."), span_notice("You have disarmed \the [src]."))
sprung = TRUE
update_icon()
else
trigger(user, TRUE)
else
user.visible_message(span_danger("[user] starts to reset \the [src]."), span_notice("You begin resetting \the [src]."), "You hear the slow creaking of a spring.")
if(do_after(user, 5 SECONDS, target = src))
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
sprung = FALSE
update_icon()
/obj/structure/spring_trap/proc/trigger(mob/living/target)
SSmotiontracker.ping(src, 100)
log_and_message_admins("has been yote by a [name] at \the [get_area(loc)], last touched by [forensic_data?.get_lastprint()]", target)
playsound(src, 'sound/machines/click.ogg', 50, 1)
visible_message(span_danger("[target] triggers \the [src]."), span_danger("You trigger \the [src]."), span_infoplain(span_bold("You hear a spring creaking!")))
var/turf/T = get_turf(src)
if(!T)
return
var/turf/land_turf = T
for(var/i, i < max_distance, i++)
if(iswall(land_turf))
continue
land_turf = get_step(land_turf, dir)
for(var/atom/movable/thing in (T.contents | target))
if(thing == src || thing.anchored)
continue
if(isliving(target))
var/mob/living/L = target
if(L.mob_size <= MOB_TINY)
var/turf/new_turf = land_turf
for(var/i, i < max_distance, i++)
if(iswall(new_turf))
continue
new_turf = get_step(new_turf, dir)
L.throw_at(new_turf, distance, 1)
continue
thing.throw_at(land_turf, distance, 1)
sprung = TRUE
addtimer(CALLBACK(src, PROC_REF(reset)), reset_time, TIMER_DELETE_ME)
/obj/structure/spring_trap/Crossed(atom/movable/AM)
if(AM.is_incorporeal() || isobserver(AM) || istype(AM, /obj/effect/abstract) || AM.throwing || istype(AM, /obj/item/projectile))
return
if(!sprung)
if(isliving(AM))
var/mob/living/L = AM
if(!(L.m_intent == I_RUN))
return
trigger(AM)
..()
/obj/structure/spring_trap/proc/reset()
if(!sprung)
return FALSE
SSmotiontracker.ping(src, 100)
visible_message(span_notice("[src] clicks as it resets itself."), "You hear the slow creaking of a spring.")
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
sprung = FALSE
/obj/item/spring_trap_kit
name = "spring trap assembly kit"
gender = PLURAL
icon = 'icons/obj/items.dmi'
icon_state = "spring_trap-kit"
/obj/item/spring_trap_kit/attack_self(mob/user, modifiers)
. = ..()
user.visible_message(span_danger("[user] starts to construct \the [src]."), span_notice("You start constructing \the [src]"))
if(do_after(user, 10 SECONDS, target = src))
playsound(src, 'sound/machines/click.ogg', 50, 1)
var/obj/structure/spring_trap/spring_trap = new(get_turf(src))
spring_trap.add_fingerprint(user)
spring_trap.dir = user.dir
qdel(src)