From cf14d3206d1b9199dbf3b9780189bcd9a200686e Mon Sep 17 00:00:00 2001 From: Guti <32563288+TheCaramelion@users.noreply.github.com> Date: Fri, 3 Jul 2026 04:37:11 +0200 Subject: [PATCH] Adds the spring trap (#19563) * Spring trap * spring sproing * waddlefix * Spring trap kit icon * Delete this Co-authored-by: Cameron Lennox --------- Co-authored-by: Cameron Lennox --- code/datums/components/traits/waddle.dm | 4 +- code/game/objects/structures/spring_trap.dm | 131 ++++++++++++++++++ .../research/tg/designs/tool_designs.dm | 11 ++ .../tg/techwebs/nodes/service_nodes.dm | 1 + icons/obj/items.dmi | Bin 110386 -> 111681 bytes vorestation.dme | 1 + 6 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 code/game/objects/structures/spring_trap.dm diff --git a/code/datums/components/traits/waddle.dm b/code/datums/components/traits/waddle.dm index 4f1e82b7b0..8548e19599 100644 --- a/code/datums/components/traits/waddle.dm +++ b/code/datums/components/traits/waddle.dm @@ -22,9 +22,9 @@ SIGNAL_HANDLER if (QDELETED(our_atom)) return - //Living owner only. No waddling while downed. + //Living owner only. No waddling while downed or being thrown. if(living_owner) - if(living_owner.stat != CONSCIOUS || living_owner.resting) + if(living_owner.stat != CONSCIOUS || living_owner.resting || living_owner.throwing) return if(waddling) waddle_waddle(our_atom) diff --git a/code/game/objects/structures/spring_trap.dm b/code/game/objects/structures/spring_trap.dm new file mode 100644 index 0000000000..8e8e79c3ec --- /dev/null +++ b/code/game/objects/structures/spring_trap.dm @@ -0,0 +1,131 @@ +/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()) + 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) + qdel(src) diff --git a/code/modules/research/tg/designs/tool_designs.dm b/code/modules/research/tg/designs/tool_designs.dm index a92c09bbbb..0bbc58515b 100644 --- a/code/modules/research/tg/designs/tool_designs.dm +++ b/code/modules/research/tg/designs/tool_designs.dm @@ -317,6 +317,17 @@ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_JANITORIAL ) +/datum/design_techweb/springtrap + name = "spring trap kit" + desc = "A mechanically activated spring trap. Low-tech, but reliable." + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 18750) + id = "springtrap" + build_path = /obj/item/spring_trap_kit + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_JANITORIAL + ) + /datum/design_techweb/experimental_welder name = "Experimental welding tool" desc = "A welding tool that generate fuel for itself." diff --git a/code/modules/research/tg/techwebs/nodes/service_nodes.dm b/code/modules/research/tg/techwebs/nodes/service_nodes.dm index a6b4611df5..0f2bafc105 100644 --- a/code/modules/research/tg/techwebs/nodes/service_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/service_nodes.dm @@ -65,6 +65,7 @@ "beartrap", "barbedwire", "snarewire", + "springtrap", // "buffer", "washing" ) diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 2ebe64650d041ccc34ffe91bdd6cbc0908d19758..b139826d50a109e4dfc3f3dc04bf37dc16e5c643 100644 GIT binary patch delta 10287 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 c)oo-dB