Taj rebalance patch (#22451)

This is based on requests from the taj lore team. A future PR will do
more for the sensitive hearing as well, but the PR was growing by quite
a lot so it was best to split it up.

New: 
- Tajaran eyes can now extend their vision by 3 tiles while they stand
still.
- Taj can hear people whispering and talking into radios from 1 tiles
further away, if they are listening intently.

Bugfixes:
- Flashbangs no longer fuck taj up as much unless they got intent listen
active.
- The message for autakh farseer eyes no longer gives the wrong message
if it is disabled by moving.

Balance & Change:
- Taj have new heights. Before it was 150 to 190 cm
  - Hharar: 145-180
  - M'sai: 155-175
  - Zhan: 160-195
- The brute mod have been adjusted on tajara
  - Zhan: 10% -> 5%
  - Hharar: 20% -> 10%
  - M'sai: 30% -> 15%

Backend stuff:
- Action buttons were changed to accept lists, so multiple actions can
be given to a single item.
This commit is contained in:
Casper3667
2026-06-01 10:36:57 +00:00
committed by GitHub
parent 1b60e9948d
commit 8e53577ee7
14 changed files with 162 additions and 32 deletions
+15 -3
View File
@@ -136,6 +136,8 @@
var/zoomdevicename
/// Boolean, `TRUE` if item is actively being used to zoom. For scoped guns and binoculars.
var/zoom = FALSE
/// The message used when stopping looking through a pair of binoculars/scope
var/zoom_out_message
/// Boolean, if item_state, lefthand, righthand, and worn sprite are all in one dmi
var/contained_sprite = FALSE
@@ -259,8 +261,16 @@
var/mob/m = loc
m.drop_from_inventory(src, null)
if(!QDELETED(action))
if(islist(action))
var/list/action_list = action
for(var/i in 1 to action_list.len)
var/datum/action/A = action_list[i]
if(!QDELETED(A))
QDEL_NULL(A)
action_list.Cut()
else if(!QDELETED(action))
QDEL_NULL(action) // /mob/living/proc/handle_actions() creates it, for ungodly reasons
action = null
if(!QDELETED(hidden_uplink))
@@ -1005,9 +1015,11 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
M.client.pixel_x = 0
M.client.pixel_y = 0
if(!cannotzoom)
if(show_zoom_message)
if(!cannotzoom && show_zoom_message)
if(!zoom_out_message)
M.visible_message("[zoomdevicename ? "<b>[M]</b> looks up from \the [src.name]" : "<b>[M]</b> lowers \the [src.name]"].")
else
M.visible_message("[zoomdevicename ? "<b>[M]</b>[zoom_out_message] \the [src.name]." : "<b>[M]</b>[zoom_out_message]"]")
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -36,13 +36,21 @@
if(M.flash_act(ignore_inherent = TRUE))
M.Weaken(10)
// 1 - 9x/70 gives us 100% at zero, 87% at 1 turf, all the way to 10% at 7
var/bang_intensity = 1 - (9 * get_dist(T, M) / 70)
M.noise_act(intensity = EAR_PROTECTION_MODERATE, damage_pwr = 10 * bang_intensity, deafen_pwr = 15 * (1 - bang_intensity))
var/distance_to_grenade = get_dist(T, M)
if(M.get_hearing_sensitivity()) // we only stun if they've got sensitive ears
// 1 - 9x/70 gives us 100% at zero, 87% at 1 turf, all the way to 10% at 7
var/bang_intensity = 1 - (9 * distance_to_grenade / 70)
var/ear_damage = 10 * bang_intensity
var/deafen_damage = 15 * (1 - bang_intensity)
// we only stun if they've got sensitive ears and got it active as well as if it is close enough.
if(M.get_hearing_sensitivity() && astype(M, /mob/living/carbon/human)?.is_listening() && distance_to_grenade < 5)
// checking for protection is handled by noise_act
M.noise_act(intensity = EAR_PROTECTION_MAJOR, stun_pwr = 2)
M.noise_act(intensity = EAR_PROTECTION_MAJOR, stun_pwr = 2, damage_pwr = ear_damage, deafen_pwr = deafen_damage)
else
M.noise_act(intensity = EAR_PROTECTION_MODERATE, damage_pwr = ear_damage, deafen_pwr = deafen_damage)
M.disable_cloaking_device()
M.update_icon()