Skip to content

Commit

Permalink
autoclimbable handrails on harm intent (#6652)
Browse files Browse the repository at this point in the history
# About the pull request

you do climb when you collide with handrail, rejoice. this makes
handrails lot less of an obsticle for both huge xenos and highly rained
and agile marines. also there is autoclimbable var that can be set to
FALSE on req railing so you can not throw others out of the line


# Explain why it's good for the game

handrails can be major pain in ass for both marines and xenos, especily
as they are used near ledges so you auto climb from one side to other
but have to manualy climb back. they are also sometimes hard to spot and
can get you stuck and killed, generly getting stoped by railing that you
did not see feels like shit as both sides can shoot or slash it down in
seconds. I am gona put this as QOL but if you think it is balance then
so be it


# Testing Photographs and Procedure
<details>
<summary>Screenshots & Videos</summary>

Put screenshots and videos here with an empty line between the
screenshots and the `<details>` tags.

</details>


# Changelog
:cl:
qol: handrails are autoclimbable when on harm intent, you take some harm
when doing so
balance: crusher and ravager destroy handrails when trying to pass them
similar to tables
/:cl:

---------

Co-authored-by: vincibrv <[email protected]>
Co-authored-by: Drathek <[email protected]>
  • Loading branch information
3 people authored Nov 9, 2024
1 parent c43877d commit beaf417
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
7 changes: 4 additions & 3 deletions code/game/objects/structures.dm
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@

/obj/structure/proc/do_climb(mob/living/user, mods)
if(!can_climb(user))
return
return FALSE

var/list/climbdata = list("climb_delay" = climb_delay)
SEND_SIGNAL(user, COMSIG_LIVING_CLIMB_STRUCTURE, climbdata)
Expand All @@ -120,10 +120,10 @@
user.visible_message(SPAN_WARNING("[user] starts [flags_atom & ON_BORDER ? "leaping over" : climb_over_string] \the [src]!"))

if(!do_after(user, final_climb_delay, INTERRUPT_NO_NEEDHAND, BUSY_ICON_GENERIC, numticks = 2))
return
return FALSE

if(!can_climb(user))
return
return FALSE

var/turf/TT = get_turf(src)
if(flags_atom & ON_BORDER)
Expand All @@ -145,6 +145,7 @@
user.forceMove(TT)
for(var/atom/movable/thing as anything in grabbed_things) // grabbed things aren't moved to the tile immediately to: make the animation better, preserve the grab
thing.forceMove(TT)
return TRUE

/obj/structure/proc/structure_shaken()

Expand Down
44 changes: 44 additions & 0 deletions code/game/objects/structures/barricade/handrail.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,18 @@
var/build_state = BARRICADE_BSTATE_SECURED
var/reinforced = FALSE //Reinforced to be a cade or not
var/can_be_reinforced = TRUE //can we even reinforce this handrail or not?
///Whether a ground z-level handrail allows auto-climbing on harm intent
var/autoclimb = TRUE

/obj/structure/barricade/handrail/Initialize(mapload, ...)
. = ..()
if(!is_ground_level(z))
if(autoclimb && is_mainship_level(z))
RegisterSignal(SSdcs, COMSIG_GLOB_HIJACK_LANDED, PROC_REF(reset_autoclimb))
autoclimb = FALSE

/obj/structure/barricade/handrail/proc/reset_autoclimb()
autoclimb = initial(autoclimb)

/obj/structure/barricade/handrail/update_icon()
overlays.Cut()
Expand All @@ -40,6 +52,38 @@
if(E.icon_path && E.obj_icon_state_path)
overlays += image(E.icon_path, icon_state = E.obj_icon_state_path)

/obj/structure/barricade/handrail/Collided(atom/movable/movable)
if(!ismob(movable))
return ..()

if(istype(movable, /mob/living/carbon/xenomorph/ravager) || istype(movable, /mob/living/carbon/xenomorph/crusher))
var/mob/living/carbon/xenomorph/xenomorph = movable
if(!xenomorph.stat)
visible_message(SPAN_DANGER("[xenomorph] plows straight through [src]!"))
deconstruct(FALSE)
return
else
if(!autoclimb)
return ..()

if(movable.last_bumped == world.time)
return ..()

var/mob/living/climber = movable
if(climber.a_intent != INTENT_HARM)
return ..()

climber.client?.move_delay += 3 DECISECONDS
if(do_climb(climber))
if(prob(25))
if(ishuman(climber))
var/mob/living/carbon/human/human = climber
human.apply_damage(5, BRUTE, no_limb_loss = TRUE)
else
climber.apply_damage(5, BRUTE)
climber.visible_message(SPAN_WARNING("[climber] injures themselves vaulting over [src]."), SPAN_WARNING("You hit yourself as you vault over [src]."))
..()

/obj/structure/barricade/handrail/get_examine_text(mob/user)
. = ..()
switch(build_state)
Expand Down

0 comments on commit beaf417

Please sign in to comment.