Mech Legs Balance Pass (#21946)

This PR tweaks the stats for several of the mech legs to have fairer
movespeed characteristics and be a lot less punishing for taking damage.
The general complaint I saw from players was that taking enough damage
made the mechs suddenly feel useless, as the extra delays from leg
damage were far too punishing.

I also added a new mechanic for the extremely rare Cult Mech that allows
it to actually GAIN movement speed when damaged, as a sort of "Fragile
Berserker" mechanic that will help make it actually useful as a melee
combatant gimmick. I came up with that idea after watching a round where
an antag managed to get a cult mech, but he was physically incapable of
getting into melee with anyone while driving it.

As a bugfix, this PR fixes glide sizes for mechs so that their smooth
movement correctly reflects how the different directions have different
movement speeds.


https://github.com/user-attachments/assets/0bf63edd-b0db-4257-a6e4-c42e5cf16962
This commit is contained in:
VMSolidus
2026-03-04 19:51:27 +00:00
committed by GitHub
parent e9a722fccf
commit 826aa5bf95
12 changed files with 42 additions and 12 deletions
@@ -25,6 +25,12 @@
*/
var/damaged_delay = 10
/**
* Linear slope of a mech's damage delay characteristics, EG how "fast" it linearly scales.
* This allows floating points, and can technically be a negative number. EG: "Rage mechanic where being damaged makes the mech faster"
*/
var/damaged_delay_slope = 1.0
var/obj/item/robot_parts/robot_component/actuator/motivator
var/mech_turn_sound = 'sound/mecha/mechturn.ogg'
var/mech_step_sound = 'sound/mecha/mechstep.ogg'
+3 -3
View File
@@ -28,7 +28,7 @@
to_chat(user, SPAN_WARNING("The power indicator flashes briefly."))
return
next_mecha_move = world.time + (incorporeal_move ? legs.move_delay / 2 : legs.move_delay) + (legs.damaged_delay * (legs.total_damage / legs.max_damage))
next_mecha_move = world.time + (incorporeal_move ? legs.move_delay / 2 : legs.move_delay) + (legs.damaged_delay * (legs.total_damage / legs.max_damage) * legs.damaged_delay_slope)
return TRUE
/mob/living/heavy_vehicle/proc/can_turn(var/mob/user)
@@ -61,7 +61,7 @@
to_chat(user, SPAN_WARNING("The power indicator flashes briefly."))
return
next_mecha_turn = world.time + legs.turn_delay + (legs.damaged_delay * (legs.total_damage / legs.max_damage))
next_mecha_turn = world.time + legs.turn_delay + (legs.damaged_delay * (legs.total_damage / legs.max_damage) * legs.damaged_delay_slope)
return TRUE
/mob/living/heavy_vehicle/proc/can_strafe(var/mob/user)
@@ -100,7 +100,7 @@
to_chat(user, SPAN_WARNING("The power indicator flashes briefly."))
return
next_mecha_move = world.time + ((legs.move_delay + (legs.damaged_delay * (legs.total_damage / legs.max_damage))) * legs.strafe_delay_modifier)
next_mecha_move = world.time + ((legs.move_delay + (legs.damaged_delay * (legs.total_damage / legs.max_damage) * legs.damaged_delay_slope)) * legs.strafe_delay_modifier)
return TRUE
/mob/living/heavy_vehicle/get_standard_pixel_x()
@@ -361,12 +361,15 @@
Move(src.loc, direction, 0, TRUE)
/mob/living/heavy_vehicle/Move(atom/newloc, direct, glide_size_override = 0, update_dir = TRUE)
// They shouldn't get to this proc without legs in the first place, but its okay to guard here.
if (!legs)
return
. = ..()
set_glide_size(DELAY_TO_GLIDE_SIZE(next_mecha_move - world.time))
if(. && !istype(loc, /turf/space))
if(legs)
if(legs.mech_step_sound)
playsound(src.loc, legs.mech_step_sound, 40, TRUE)
use_cell_power(legs.power_use * CELLRATE)
if(legs.mech_step_sound)
playsound(src.loc, legs.mech_step_sound, 40, TRUE)
use_cell_power(legs.power_use * CELLRATE)
update_icon()
/mob/living/heavy_vehicle/Post_Incorpmove()
@@ -33,6 +33,9 @@
max_damage = 100
power_use = 2500
trample_damage = 35
// Dedicated combat chassis is highly resistant to mobility loss until a full "mobility kill"
damaged_delay = 3
damaged_delay_slope = 0.5
/obj/item/mech_component/sensors/combat
name = "combat sensors"
@@ -38,6 +38,11 @@
power_use = 2500
trample_damage = 45
// Uniquely increases speed when damaged. Fragile, but good for melee.
// It can become faster than a light mech, but only when on the verge of death.
damaged_delay = 4
damaged_delay_slope = -1
/obj/item/mech_component/sensors/cult
name = "daemon sensors"
desc = "A hard shell to protect those that follow the Great One, these sensors assist in the slaughter."
@@ -33,6 +33,7 @@
max_damage = 200
power_use = 2500
trample_damage = 45
damaged_delay = 5
/obj/item/mech_component/sensors/heavy
name = "heavy sensors"
@@ -8,7 +8,7 @@
max_damage = 150
move_delay = 5
turn_delay = 2
strafe_delay_modifier = 1 // No delay on strafing.
strafe_delay_modifier = 1.2 // minimal delay on strafing.
reverse_delay = 10
power_use = 2500
trample_damage = 0
@@ -22,6 +22,6 @@
max_damage = 75
move_delay = 2
turn_delay = 2
strafe_delay_modifier = 1 // No delay on strafing.
strafe_delay_modifier = 1.2 // minimal delay on strafing.
reverse_delay = 5
power_use = 2000
@@ -29,6 +29,7 @@
icon_state = "light_legs"
move_delay = 2
turn_delay = 2
damaged_delay = 4
max_damage = 100
power_use = 1500
desc = "The electrical systems driving these legs are almost totally silent. Unfortunately slamming a plate of metal against the ground is not."
@@ -16,6 +16,8 @@
desc = "Four utterly goliath stump-like pistons hold this propulsion mechanism together."
icon_state = "strider_legs"
move_delay = 5
damaged_delay = 5
damaged_delay_slope = 0.5
max_damage = 650
power_use = 2500
trample_damage = 45
+5 -3
View File
@@ -6,8 +6,9 @@
max_damage = 160
move_delay = 4
turn_delay = 1
reverse_delay = 2 // Faster than usual reverse for legs
strafe_delay_modifier = 1.2 // Faster than usual strafing
reverse_delay = 1 // Faster than usual reverse for legs
strafe_delay_modifier = 1 // Uniquely the only chassis without a strafe delay
damaged_delay = 4
power_use = 1250
trample_damage = 10
@@ -18,8 +19,8 @@
icon_state = "spiderlegs-industrial"
max_damage = 250
move_delay = 5
damaged_delay = 5
turn_delay = 1
strafe_delay_modifier = 1.2 // Faster than usual strafing
power_use = 3500
trample_damage = 25
@@ -30,6 +31,7 @@
icon_state = "tracks"
max_damage = 450
move_delay = 2 //Its fast
damaged_delay = 2
turn_delay = 7
reverse_delay = 0 // Uniquely the only chassis without a reverse delay.
power_use = 3500
@@ -28,6 +28,7 @@
desc = "Strong legs adapted for the Adhomian rought terrain."
icon_state = "egg_legs"
move_delay = 3
damaged_delay = 3
turn_delay = 3
max_damage = 100
power_use = 2500