Files
VMSolidus 48d8a06d1c Conditioning Skill And Mass (#22747)
This PR does a few new things:

1. Adds a Mass var for Movables (/Mob, /Obj) which is literally required
for me to do anything at all with Kinematics (Very routine basic
physics)
2. Adds a derived "effective mass" statistic which is generated via
signal hook, allowing sources like Skills, Drugs, Cybernetics etc to
pitch in and contribute to a user's "Strength" in certain situations
without directly modifying mass.
3. Adds a mass modifier var for species datums, while painstakingly
calibrating each and every single species with consultation from every
lore team. A baseline human gets 72.0kg of Human Reference Mass. Any
species applied to it will multiply this by a constant that
algebraically cancels out the Human Reference Mass and replaces it with
a Species Reference Mass. Changing a species via the usual procs will
reset and then re-apply the correct values.
4. Refactored Lift/Drag/Fireman to have limits and penalties based on
relative effective mass
5. Finally, to make use of all this, I've added a new Conditioning
Skill, which modifies effective mass.

The standard assumption made for Lift/Carry is based in an assumption
that a typical character should realistically be able to
lift/carry/fireman a person 1.25x their mass. Previously the fireman
carry mechanic was heavily hardcoded, and didn't have much in the way of
granularity. If I wanted to RP a character that was a bodybuilder, there
wasn't really a way to do this. With this PR, there's now a fairly large
variety of interesting breakpoints.

This also allows there to be more granularity between different species
as desired by our lore teams. For example, a Zhan is in general stronger
than a M'sai. To give an example in the breakpoints for two different
species:

Human Lift Breakpoints:
Rank 1: 90kg (lift a Skrell, Human, Offworlder, M'sai, KA, or ZA)
Rank 2: 112.5kg (Lift a Zhan, Shell, or Diona Coeus)
Rank 3: 135kg (Lift a (Non-Industrial) IPC, Unathi)
Rank 4: 157.5kg (No new breakpoints, though you get less a movespeed
penalty from lugging around any of the above)
Can Never Lift: Industrial, Bullwark, Diona, Vaurca Ta'

Zhan Tajara Lift Breakpoints:
Rank 1: 116kg (Skrell, Human, Offworlder, M'sai, Ka, Za, Zhan, Shell, or
Diona Coeus)
Rank 2: 145kg (Non-Industrial IPC, Unathi)
Rank 3: 174kg (No new breakpoints, though you get less penalties from
the above)
Rank 4: 203kg (Juuuust barely lift an Industrial or Diona with heavy
slowdown)

<img width="1078" height="436" alt="image"
src="https://github.com/user-attachments/assets/a6802515-a827-4dc1-8734-55b604c589ab"
/>

Conditioning as a Skill sits in the Occupational category, which has
been carefully chosen and designed around to create a fairly compelling
web of opportunity costs. As a skill, it's very desireable for basically
any person that wants to play a "Muscular character" and also enjoys
fireman carrying people around, which makes it particularly useful for
hangar techs. By contrast a Paramedic might not actually need this
skill, since they can bypass the usual limits by just using rollerbeds.

---------

Signed-off-by: VMSolidus <evilexecutive@gmail.com>
2026-07-12 18:06:51 +00:00

98 lines
3.4 KiB
Plaintext

/mob/living/carbon/update_emotes()
. = ..(skip_sort=1)
if(species)
for(var/emote in species.default_emotes)
var/singleton/emote/emote_datum = GET_SINGLETON(emote)
if(emote_datum.check_user(src))
usable_emotes[emote_datum.key] = emote_datum
usable_emotes = sortAssoc(usable_emotes)
// Specific defines follow.
/datum/species/slime
default_emotes = list(
/singleton/emote/visible/bounce,
/singleton/emote/visible/jiggle,
/singleton/emote/visible/lightup,
/singleton/emote/visible/vibrate
)
/datum/species/unathi
default_emotes = list(
/singleton/emote/human/swish,
/singleton/emote/human/wag,
/singleton/emote/human/sway,
/singleton/emote/human/qwag,
/singleton/emote/human/fastsway,
/singleton/emote/human/swag,
/singleton/emote/human/stopsway,
/singleton/emote/visible/tflick,
/singleton/emote/audible/lizard_bellow,
/singleton/emote/audible/hiss,
/singleton/emote/audible/hiss/long,
/singleton/emote/audible/growl
)
pain_emotes_with_pain_level = list(
list(/singleton/emote/audible/roar, /singleton/emote/audible/whimper, /singleton/emote/audible/moan) = 70,
list(/singleton/emote/audible/grunt, /singleton/emote/audible/groan, /singleton/emote/audible/moan) = 40,
list(/singleton/emote/audible/grunt, /singleton/emote/audible/groan) = 10,
)
/datum/species/diona
default_emotes = list(
/singleton/emote/audible/chirp,
/singleton/emote/audible/multichirp,
/singleton/emote/audible/nymphsqueal,
/singleton/emote/audible/painrustle,
/singleton/emote/audible/paincreak
)
pain_emotes_with_pain_level = list(
list(/singleton/emote/audible/painrustle, /singleton/emote/audible/paincreak, /singleton/emote/audible/nymphsqueal) = 70,
list(/singleton/emote/audible/painrustle, /singleton/emote/audible/nymphsqueal) = 40,
list(/singleton/emote/audible/paincreak) = 10,
)
/datum/species/bug
default_emotes = list(
/singleton/emote/audible/hiss,
/singleton/emote/audible/chitter,
/singleton/emote/audible/shriek,
/singleton/emote/audible/screech,
/singleton/emote/audible/click,
/singleton/emote/audible/clack
)
pain_emotes_with_pain_level = list(
list(/singleton/emote/audible/screech, /singleton/emote/audible/shriek) = 70,
list(/singleton/emote/audible/shriek, /singleton/emote/audible/hiss) = 40,
list(/singleton/emote/audible/hiss) = 10,
)
/datum/species/tajaran
default_emotes = list(
/singleton/emote/audible/howl,
/singleton/emote/audible/hiss,
/singleton/emote/visible/flick,
/singleton/emote/visible/tflick,
/singleton/emote/human/swish,
/singleton/emote/human/wag,
/singleton/emote/human/sway,
/singleton/emote/human/qwag,
/singleton/emote/human/fastsway,
/singleton/emote/human/swag,
/singleton/emote/human/stopsway
)
pain_emotes_with_pain_level = list(
list(/singleton/emote/audible/scream, /singleton/emote/audible/whimper, /singleton/emote/audible/moan, /singleton/emote/audible/cry, /singleton/emote/audible/howl) = 70,
list(/singleton/emote/audible/grunt, /singleton/emote/audible/groan, /singleton/emote/audible/moan, /singleton/emote/audible/hiss) = 40,
list(/singleton/emote/audible/grunt, /singleton/emote/audible/groan, /singleton/emote/audible/hiss) = 10,
)
/datum/species/skrell
default_emotes = list(
/singleton/emote/audible/warble,
/singleton/emote/audible/croon,
/singleton/emote/audible/lowarble,
/singleton/emote/audible/croak,
/singleton/emote/audible/peep,
/singleton/emote/audible/puff
)