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

41 lines
2.8 KiB
Plaintext

#define COMSIG_BASENAME_RENAME "base_name_rename"
#define COMSIG_BASENAME_SETNAME "base_name_setname"
#define ARMED_COMBAT_SKILL_COMPONENT /datum/component/skill/armed_combat
#define FIREARMS_SKILL_COMPONENT /datum/component/skill/firearms
#define UNARMED_COMBAT_SKILL_COMPONENT /datum/component/skill/unarmed_combat
#define PILOT_MECHS_SKILL_COMPONENT /datum/component/skill/pilot_mechs
#define PILOT_SPACECRAFT_SKILL_COMPONENT /datum/component/skill/pilot_spacecraft
#define ROBOTICS_SKILL_COMPONENT /datum/component/skill/robotics
#define ARCHAOLOGY_SKILL_COMPONENT /datum/component/skill/archaology
#define RESEARCH_SKILL_COMPONENT /datum/component/skill/research
#define XENOBIOLOGY_SKILL_COMPONENT /datum/component/skill/xenobiology
#define XENOBOTANY_SKILL_COMPONENT /datum/component/skill/xenobotany
#define BARTENDING_SKILL_COMPONENT /datum/component/skill/bartending
#define COOKING_SKILL_COMPONENT /datum/component/skill/cooking
#define ENTERTAINING_SKILL_COMPONENT /datum/component/skill/entertaining
#define GARDENING_SKILL_COMPONENT /datum/component/skill/gardening
#define MEDICINE_SKILL_COMPONENT /datum/component/skill/medicine
#define SKILL_COMPONENT /datum/component/skill
#define MORALE_COMPONENT /datum/component/morale
#define ELECTRICAL_ENGINEERING_SKILL_COMPONENT /datum/component/skill/electrical_engineering
#define MECHANICAL_ENGINEERING_SKILL_COMPONENT /datum/component/skill/mechanical_engineering
#define ATMOSPHERICS_SYSTEMS_SKILL_COMPONENT /datum/component/skill/atmospherics_systems
#define REACTOR_SYSTEMS_SKILL_COMPONENT /datum/component/skill/reactor_systems
#define LEADERSHIP_SKILL_COMPONENT /datum/component/skill/leadership
#define ANATOMY_SKILL_COMPONENT /datum/component/skill/anatomy
#define FORENSICS_SKILL_COMPONENT /datum/component/skill/forensics
#define PHARMACOLOGY_SKILL_COMPONENT /datum/component/skill/pharmacology
#define SURGERY_SKILL_COMPONENT /datum/component/skill/surgery
#define TOOL_COMPONENT /datum/component/tool_quality_container
#define CAROUSING_SKILL_COMPONENT /datum/component/skill/carousing
#define TENACITY_SKILL_COMPONENT /datum/component/skill/tenacity
#define MINISTRY_SKILL_COMPONENT /datum/component/skill/ministry
#define CONDITIONING_SKILL_COMPONENT /datum/component/skill/conditioning
/**
* Trinary-Boolean helper that either returns null, or the skill level of a given skill component(which can be zero).
* It will ALWAYS be null if you try to use this to check for something that isn't a skill component, so just don't. Refer to the list above this function to see what your options are.
* Therefore, merely checking if (!this) is not sufficient to use this function, and instead you should be using isnull() on it to determine whether or not the skill exists.
*/
#define GET_SKILL_LEVEL(user, comp) astype(user.GetComponent(comp), SKILL_COMPONENT)?.skill_level