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)