From 131e631cc4133d4004d373d13b441eec36f4dc19 Mon Sep 17 00:00:00 2001
From: Luc <89928798+lewcc@users.noreply.github.com>
Date: Fri, 17 May 2024 07:37:16 -0400
Subject: [PATCH] Adds a rod smite (#25424)
* better
* no more ripping
---
code/modules/admin/topic.dm | 9 ++++-
code/modules/events/immovable_rod.dm | 49 +++++++++++++++++++++-------
2 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index b945dca68e4..cdbce0a63d8 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2062,6 +2062,7 @@
ptypes += "Shamebrero"
ptypes += "Nugget"
ptypes += "Bread"
+ ptypes += "Rod"
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
if(!(punishment in ptypes))
return
@@ -2185,7 +2186,6 @@
to_chat(H, "You feel as if your limbs are being ripped from your body!")
addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, make_nugget)), 6 SECONDS)
logmsg = "nugget"
-
if("Bread")
var/mob/living/simple_animal/shade/sword/bread/breadshade = new(H.loc)
var/bready = pick(/obj/item/food/snacks/customizable/cook/bread, /obj/item/food/snacks/sliceable/meatbread, /obj/item/food/snacks/sliceable/xenomeatbread, /obj/item/food/snacks/sliceable/spidermeatbread, /obj/item/food/snacks/sliceable/bananabread, /obj/item/food/snacks/sliceable/tofubread, /obj/item/food/snacks/sliceable/bread, /obj/item/food/snacks/sliceable/creamcheesebread, /obj/item/food/snacks/sliceable/banarnarbread, /obj/item/food/snacks/flatbread, /obj/item/food/snacks/baguette)
@@ -2196,6 +2196,13 @@
qdel(H)
logmsg = "baked"
to_chat(breadshade, "Get bready for combat, you've been baked into a piece of bread! Before you break down and rye thinking that your life is over, people are after you waiting for a snack! If you'd rather not be toast, lunge away from any hungry crew else you bite the crust. At the yeast you may survive a little longer...")
+ if("Rod")
+
+ var/starting_turf_x = M.x + rand(10, 15) * pick(1, -1)
+ var/starting_turf_y = M.y + rand(10, 15) * pick(1, -1)
+ var/turf/start = locate(starting_turf_x, starting_turf_y, M.z)
+
+ new /obj/effect/immovablerod/smite(start, M)
if(logmsg)
log_admin("[key_name(owner)] smited [key_name(M)] with: [logmsg]")
message_admins("[key_name_admin(owner)] smited [key_name_admin(M)] with: [logmsg]")
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 62b4840f32b..490290d28db 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -20,7 +20,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
new /obj/effect/immovablerod/event(startT, endT)
/obj/effect/immovablerod
- name = "Immovable Rod"
+ name = "\improper Immovable Rod"
desc = "What the fuck is that?"
icon = 'icons/obj/objects.dmi'
icon_state = "immrod"
@@ -28,23 +28,28 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
density = TRUE
anchored = TRUE
var/z_original = 0
- var/destination
var/notify = TRUE
var/move_delay = 1
+ var/atom/start
+ var/atom/end
-/obj/effect/immovablerod/New(atom/start, atom/end, delay)
+/obj/effect/immovablerod/New(atom/_start, atom/_end, delay)
. = ..()
+ start = _start
+ end = _end
loc = start
z_original = z
- destination = end
move_delay = delay
if(notify)
notify_ghosts("\A [src] is inbound!",
enter_link="(Click to follow)",
source = src, action = NOTIFY_FOLLOW)
GLOB.poi_list |= src
+ head_towards_dest()
+
+/obj/effect/immovablerod/proc/head_towards_dest()
if(end?.z == z_original)
- walk_towards(src, destination, move_delay)
+ walk_towards(src, end, move_delay)
/obj/effect/immovablerod/Topic(href, href_list)
if(href_list["follow"])
@@ -76,13 +81,13 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
if(isturf(clong) || isobj(clong))
if(clong.density)
- clong.ex_act(2)
+ clong.ex_act(EXPLODE_HEAVY)
else if(ismob(clong))
if(ishuman(clong))
var/mob/living/carbon/human/H = clong
- H.visible_message("[H.name] is penetrated by an immovable rod!" ,
- "The rod penetrates you!" ,
+ H.visible_message("[H.name] is penetrated by an immovable rod!",
+ "The rod penetrates you!",
"You hear a CLANG!")
H.adjustBruteLoss(160)
if(clong.density || prob(10))
@@ -100,12 +105,34 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
var/turf/simulated/floor/T = get_turf(oldloc)
if(istype(T))
T.ex_act(EXPLODE_HEAVY)
- if(loc == destination)
+ if(loc == end)
qdel(src)
/obj/effect/immovablerod/deadchat_plays(mode = DEADCHAT_DEMOCRACY_MODE, cooldown = 6 SECONDS)
return AddComponent(/datum/component/deadchat_control/immovable_rod, mode, list(), cooldown)
+/obj/effect/immovablerod/smite
+ /// The target that we're gonna aim for between start and end
+ var/obj/effect/portal/exit
+
+/obj/effect/immovablerod/smite/New(atom/_start, atom/_end)
+ new /obj/effect/portal(start, lifespan = 2 SECONDS)
+ return ..()
+
+/obj/effect/immovablerod/smite/Move()
+ var/atom/oldloc = loc
+ . = ..()
+ if(get_turf(src) == get_turf(end))
+ // our exit condition: get outta there kowalski
+ var/target_turf = get_ranged_target_turf(src, dir, rand(1, 10))
+ start = loc
+ walk(src, 0)
+ exit = new /obj/effect/portal(target_turf, lifespan = 2 SECONDS)
+ walk_towards(src, exit, move_delay)
+ else if(locate(exit) in get_turf(src))
+ QDEL_NULL(exit)
+ qdel(src)
+
/**
* Rod will walk towards edge turf in the specified direction.
*
@@ -113,5 +140,5 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
* * direction - The direction to walk the rod towards: NORTH, SOUTH, EAST, WEST.
*/
/obj/effect/immovablerod/proc/walk_in_direction(direction)
- destination = get_edge_target_turf(src, direction)
- walk_towards(src, destination)
+ end = get_edge_target_turf(src, direction)
+ walk_towards(src, end, move_delay)