diff --git a/code/modules/heavy_vehicle/components/legs.dm b/code/modules/heavy_vehicle/components/legs.dm index 657abacb33f..4309203d00c 100644 --- a/code/modules/heavy_vehicle/components/legs.dm +++ b/code/modules/heavy_vehicle/components/legs.dm @@ -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' diff --git a/code/modules/heavy_vehicle/mech_helpers.dm b/code/modules/heavy_vehicle/mech_helpers.dm index 2fe377bc896..8757a4069be 100644 --- a/code/modules/heavy_vehicle/mech_helpers.dm +++ b/code/modules/heavy_vehicle/mech_helpers.dm @@ -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() diff --git a/code/modules/heavy_vehicle/mech_interaction.dm b/code/modules/heavy_vehicle/mech_interaction.dm index 8698fb1ad7a..73873c580c9 100644 --- a/code/modules/heavy_vehicle/mech_interaction.dm +++ b/code/modules/heavy_vehicle/mech_interaction.dm @@ -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() diff --git a/code/modules/heavy_vehicle/premade/combat.dm b/code/modules/heavy_vehicle/premade/combat.dm index 2e948dc65aa..970a79690cd 100644 --- a/code/modules/heavy_vehicle/premade/combat.dm +++ b/code/modules/heavy_vehicle/premade/combat.dm @@ -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" diff --git a/code/modules/heavy_vehicle/premade/cult.dm b/code/modules/heavy_vehicle/premade/cult.dm index 19b038b32d7..ca4fbbb14e5 100644 --- a/code/modules/heavy_vehicle/premade/cult.dm +++ b/code/modules/heavy_vehicle/premade/cult.dm @@ -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." diff --git a/code/modules/heavy_vehicle/premade/heavy.dm b/code/modules/heavy_vehicle/premade/heavy.dm index 74949de7f68..5757bd6a2dc 100644 --- a/code/modules/heavy_vehicle/premade/heavy.dm +++ b/code/modules/heavy_vehicle/premade/heavy.dm @@ -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" diff --git a/code/modules/heavy_vehicle/premade/hoverpod.dm b/code/modules/heavy_vehicle/premade/hoverpod.dm index 4c21fe4da72..adb7e97f1b3 100644 --- a/code/modules/heavy_vehicle/premade/hoverpod.dm +++ b/code/modules/heavy_vehicle/premade/hoverpod.dm @@ -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 diff --git a/code/modules/heavy_vehicle/premade/light.dm b/code/modules/heavy_vehicle/premade/light.dm index ef42515577b..d69dafbc7f7 100644 --- a/code/modules/heavy_vehicle/premade/light.dm +++ b/code/modules/heavy_vehicle/premade/light.dm @@ -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." diff --git a/code/modules/heavy_vehicle/premade/military.dm b/code/modules/heavy_vehicle/premade/military.dm index 4964d6f16c3..79d3f691d59 100644 --- a/code/modules/heavy_vehicle/premade/military.dm +++ b/code/modules/heavy_vehicle/premade/military.dm @@ -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 diff --git a/code/modules/heavy_vehicle/premade/misc.dm b/code/modules/heavy_vehicle/premade/misc.dm index 30c08fb845c..fd75befc846 100644 --- a/code/modules/heavy_vehicle/premade/misc.dm +++ b/code/modules/heavy_vehicle/premade/misc.dm @@ -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 diff --git a/code/modules/heavy_vehicle/premade/pra.dm b/code/modules/heavy_vehicle/premade/pra.dm index bffc8271987..8468fb05e7d 100644 --- a/code/modules/heavy_vehicle/premade/pra.dm +++ b/code/modules/heavy_vehicle/premade/pra.dm @@ -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 diff --git a/html/changelogs/hellfirejag-mech-leg-balance-pass.yml b/html/changelogs/hellfirejag-mech-leg-balance-pass.yml new file mode 100644 index 00000000000..9e99e25b914 --- /dev/null +++ b/html/changelogs/hellfirejag-mech-leg-balance-pass.yml @@ -0,0 +1,6 @@ +author: Hellfirejag +delete-after: True +changes: + - balance: "Balance pass for 'damaged movement delays' and movement types in general for mech legs to make them less punishing. Quad mechs now uniquely don't have a strafe delay. Combat mechs and heavier mechs are in general more resistant to losing movespeed from damage." + - rscadd: "Cult mechs now have a unique mechanic where their movement speed increases as they take damage. For the Dark Gods!" + - bugfix: "Fixed mechs not having correct glide sizes for smooth movement when strafing and reversing."