Skills System Revival: The Things She Remembered Had Never Been Her Own (#21853)

This PR is a revisit to the previously derelict PR #20159 that has been
unfinished for sometime now. More details about it in general can be
found here:
https://github.com/orgs/Aurorastation/projects/2?pane=issue&itemId=53167153

For awhile I've been talking about "Things I've been doing but it would
be really nice to do them with a skills system", or "And here's how I
would put this into the skills system when it's done". The main thing
that was stopping me from building it myself was having poor real life
skills in UI code and in DB code. However, I've gotten permission to
resume this PR, which has already completed the steps I would not have
been able to do myself. The rest of the PR fits well into my skillset as
a dev.

I'm opening this PR as a draft so as to enable my dev environment to
locally track all the previously modified files. I'll take this PR out
of draft and give this a full writeup when I have more work to show for
the PR this weekend.

### TODO

- [x] Rework a decent chunk of the currently existing skills to no
longer require hardcoded inserts into other systems. EG, converting from
classical ss13 methods, to modern /tg/-style ECS coding methods that
work off of component-signal patterns.
- [x] Make sure all of the existing skills have actual game
functionality (I won't PR a 2016 Baystation12 situation where 90% of the
skills are fluff only)
- [x] Add the various skills not yet made but are necessary for
completion sake, EG: Pilot (Spacecraft), Gunnery, Pilot (Walkers).
- [x] Examine each existing job in the game and assess whether it should
have a skill made with it in mind, or if it's covered by an existing
skill.
- [x] TO DISCUSS, BUT NOT ESSENTIAL: Additional skill proposals not
currently in the pre-existing TODO list, proposing subcategories.
- [x] Ensure that the previous TODO list is completed.

### Current Skills
The current list of skills, checkmarked for if I've completed them/they
have actual game mechanics. Or if we're just relegating them to separate
PRs. Originally this list was going to be forced to visit for a bare
minimum "does at least one thing" requirement, but now that is being
forgone due to this PR ballooning out of control and in complexity, as
well as development time overruns.

- [x] Bartending
- [x] Cooking
- [x] Gardening
- [x] Entertaining
- [x] Electrical Engineering
- [x] Mechanical Engineering
- [x] Atmospherics Systems
- [x] Reactor Systems
- [x] Medicine
- [x] Surgery
- [x] Pharmacology
- [x] Anatomy
- [x] Forensics
- [x] Robotics
- [x] Pilot: Spacecraft
- [x] Pilot: Exosuits
- [x] Research
- [x] Xenobotany
- [x] Xenoarchaeology
- [x] Xenobiology
- [x] Unarmed Combat
- [x] Armed Combat
- [x] Firearms
- [x] Leadership

---------

Signed-off-by: VMSolidus <evilexecutive@gmail.com>
Co-authored-by: Matt Atlas <liermattia@gmail.com>
Co-authored-by: FabianK3 <21039694+FabianK3@users.noreply.github.com>
Co-authored-by: Matt Atlas <mattiathebest2000@hotmail.it>
This commit is contained in:
VMSolidus
2026-04-18 14:33:48 +00:00
committed by GitHub
co-authored by Matt Atlas FabianK3 Matt Atlas
parent 2948b1dc87
commit 260f744906
107 changed files with 2965 additions and 185 deletions
@@ -0,0 +1,18 @@
/singleton/education
/// The name of this education type.
var/name
/// The description of this education type. It should ideally match what's on the Aurora wiki, but from an IC point of view.
var/description
/// Age requirement for this education. Should match the job this is intended for. This doesn't need to be here per se, but it helps to filter results.
var/list/minimum_character_age = list()
/// The jobs this education type allows you to access.
var/list/jobs = list()
/// The given skills for this education type. Linked list of skill type to level.
var/list/skills = list()
/// Species that CANNOT take this education, if necessary. This is a list of names, must match what's in the species pref variable.
/// Empty list means no restrictions.
var/list/species_restriction = list()
/singleton/education/high_school
name = "High School Diploma"
description = "Your character has a high school diploma."
@@ -0,0 +1,86 @@
/singleton/education/mechanical_engineering
name = "Mechanical Engineering"
description = "You are at least 25 years of age, with either a Bachelor's degree in Mechanical Engineering, or otherwise have functionally equivalent working experience. \
You specialize in constructing structural systems, lathing, and the more manual pleasures of engineering, such as welding and wrenching."
jobs = list("Engineer")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/mechanical_engineering = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/electrical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/atmospherics_systems = SKILL_LEVEL_TRAINED,
/singleton/skill/reactor_systems = SKILL_LEVEL_TRAINED
)
/singleton/education/electrical_engineering
name = "Electrical Engineering Background"
description = "You are at least 25 years of age, with a Bachelor's degree in Electrical Engineering, or otherwise have functionally equivalent working experience. \
You specialize in variable-voltage cabling, grid management, electronic hardware, and other electrical systems."
jobs = list("Engineer")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/mechanical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/electrical_engineering = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/atmospherics_systems = SKILL_LEVEL_TRAINED,
/singleton/skill/reactor_systems = SKILL_LEVEL_TRAINED
)
/singleton/education/atmospherics_engineer
name = "Atmospherics Systems Background"
description = "You are at least 25 years of age, with a Bachelor's degree in Atmospherics Systems, or otherwise have functionally equivalent working experience. \
You specialize in everything to do with atmospherics systems, whether that's the delivery of gases, usage of atmospherics machines, or simply how to use a pipe wrench."
jobs = list("Atmospherics Technician")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/mechanical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/electrical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/atmospherics_systems = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/reactor_systems = SKILL_LEVEL_TRAINED
)
/singleton/education/reactors_engineer
name = "Reactor Systems Background"
description = "You are at least 25 years of age, with a Bachelor's degree in Reactor Systems, or otherwise have functionally equivalent working experience. \
You specialize in everything to do with a reactor's systems, whether you are looking at a Supermatter crystal, a fusion reactor, or a combustion chamber."
jobs = list("Engineer")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/mechanical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/electrical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/atmospherics_systems = SKILL_LEVEL_TRAINED,
/singleton/skill/reactor_systems = SKILL_LEVEL_PROFESSIONAL
)
/singleton/education/experienced_engineer
name = "Engineering Certification"
description = "You are at least 25 years of age. You may not have an Engineering degree or a specialized background, but you had enough fundamental experience for the Conglomerate to validate it instead \
of a degree. You do not have the same specialization as your fellow Engineers with a degree, making up for it by being a jack of all trades. \
You could probably fix a car, whereas they might not be able to."
jobs = list("Engineer")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/mechanical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/electrical_engineering = SKILL_LEVEL_TRAINED,
/singleton/skill/atmospherics_systems = SKILL_LEVEL_TRAINED,
/singleton/skill/reactor_systems = SKILL_LEVEL_TRAINED
)
@@ -0,0 +1,102 @@
/singleton/education/surgical_degree
name = "MD, Surgery Track"
description = "You are 30 years of age or older, with an applicable MD from accredited school and you have completed 2 years of residency at an \
accredited hospital or clinic."
jobs = list("Surgeon")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/surgery = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/medicine = SKILL_LEVEL_TRAINED,
/singleton/skill/anatomy = SKILL_LEVEL_TRAINED
)
/singleton/education/physician_degree
name = "MD, Physician Track"
description = "You are at least 30 years of age, with an applicable MD from an accredited school and you have completed 2 years of residency at an \
accredited hospital or clinic."
jobs = list("Physician")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/surgery = SKILL_LEVEL_TRAINED,
/singleton/skill/medicine = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/anatomy = SKILL_LEVEL_TRAINED
)
/singleton/education/pharmacist_degree
name = "Doctor of Pharmacy"
description = "You are at least 25 years of age, with an applicable Masters from an accredited school, along with 2 years of residency at an \
accredited hospital or clinic."
jobs = list("Pharmacist")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/pharmacology = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/medicine = SKILL_LEVEL_TRAINED,
/singleton/skill/anatomy = SKILL_LEVEL_TRAINED
)
/singleton/education/psychologist_degree
name = "Doctor of Psychology"
description = "You are at least 30 years of age, with at least a doctorate from an accredited university in an applicable field. " \
+ "This is more of a research degree that has medical applications, as opposed to a true medical degree. " \
+ "As such, it is only tangentially involved with actual medicine. A character with only this education is not legally considered a licensed doctor." \
+ "You are however qualified to perform psychological evaluations on behalf of the SCC, as well as perform psychotherapy."
jobs = list("Psychologist")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/* Uncomment this block after finishing the Leadership skill. Psychologists should be able to give people morale bonuses as a mechanic.
/singleton/skill/leadership = SKILL_LEVEL_TRAINED,
*/
/singleton/skill/pharmacology = SKILL_LEVEL_FAMILIAR,
/singleton/skill/medicine = SKILL_LEVEL_FAMILIAR,
/singleton/skill/anatomy = SKILL_LEVEL_FAMILIAR,
/singleton/skill/research = SKILL_LEVEL_TRAINED
)
/singleton/education/psychiatrist_degree
name = "MD, Psychiatry Track"
description = "You are at least 30 years of age, with an applicable MD from an accredited school and you have completed 2 years of residency at an \
accredited hospital or clinic. Unlike Psychology, this is an actual medical degree, and a character with this education is considered a licensed doctor."
jobs = list("Psychiatrist")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/surgery = SKILL_LEVEL_FAMILIAR,
/singleton/skill/medicine = SKILL_LEVEL_TRAINED,
/singleton/skill/anatomy = SKILL_LEVEL_TRAINED,
/singleton/skill/pharmacology = SKILL_LEVEL_TRAINED
)
/singleton/education/paramedic
name = "Paramedic Certification"
description = "You are at least 18 years of age, with a Paramedic certification."
jobs = list("Paramedic")
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 55,
SPECIES_SKRELL_AXIORI = 55
)
skills = list(
/* Can perform only the most basic surgeries up to arterial bleeds. */
/singleton/skill/surgery = SKILL_LEVEL_FAMILIAR,
/singleton/skill/medicine = SKILL_LEVEL_TRAINED,
/singleton/skill/anatomy = SKILL_LEVEL_TRAINED
)
+19
View File
@@ -0,0 +1,19 @@
/singleton/education/finance
name = "Finance Background"
description = "You are at least 21 years of age. You possibly graduated in a field related to finance, whether that is Business Management or something else. Otherwise, you likely found your knack in the ordinary course of life such that you have comparable expertise.\
You can count very well, and you have a statistician's eye - especially for credits."
minimum_character_age = list(
SPECIES_HUMAN = 21,
SPECIES_SKRELL = 55,
SPECIES_SKRELL_AXIORI = 55
)
/singleton/education/arts
name = "Humanities Background"
description = "You are at least 21 years of age. You possibly graduated in a field related to the humanities, whether that is music, arts, linguistics, or a bachelor's in \
psychology. Otherwise, your life has provided ample opportunity for these pursuits such that you have comparable expertise. You are likely very well-read on foreign cultures and on the human mind."
minimum_character_age = list(
SPECIES_HUMAN = 21,
SPECIES_SKRELL = 55,
SPECIES_SKRELL_AXIORI = 55
)
@@ -0,0 +1,79 @@
/singleton/education/research_and_development
name = "Research & Development Degree"
description = "You are at least 30 years of age, with a PhD in an applicable field for Research and Development. This may range from a Firearms Engineering degree \
to a Bluespace Engineering degree or even Aerospace Engineering. Space is the limit for your research."
jobs = list("Scientist")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/research = SKILL_LEVEL_PROFESSIONAL
)
/singleton/education/robotics_masters
name = "Robotics Master's"
description = "You are at least 25 years of age, with a Master's in Robotics. Your specialization is in building and repairing IPCs and other smaller robots, though \
you are also capable of building exoskeletons and mechs. You're also proficient with some fundamental engineering skills, though you prefer the \
theoretical aspect and robots in general."
jobs = list("Roboticist")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/research = SKILL_LEVEL_FAMILIAR,
/singleton/skill/robotics = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/electrical_engineering = SKILL_LEVEL_FAMILIAR,
/singleton/skill/mechanical_engineering = SKILL_LEVEL_FAMILIAR,
)
/singleton/education/mechatronics_masters
name = "Mechatronics Master's"
description = "You are at least 25 years of age, with a Master's in Mechatronics. Your specialization is with building large human-sized exoskeletons and mechs, though \
you've also learnt how to repair IPCs and simpler robots as well. You're more proficient with the mechanical aspects of engineering as well."
jobs = list("Roboticist")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/research = SKILL_LEVEL_FAMILIAR,
/singleton/skill/robotics = SKILL_LEVEL_TRAINED,
/singleton/skill/electrical_engineering = SKILL_LEVEL_FAMILIAR,
/singleton/skill/mechanical_engineering = SKILL_LEVEL_PROFESSIONAL
)
/singleton/education/xenobotany_degree
name = "Xenobotany Degree"
description = "You are at least 30 years of age, with a PhD in Xenobotany. Your specialization is with discovering, sequencing, and creating alien flora... though \
you can also grow some potatoes in your spare time."
jobs = list("Xenobotanist")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/research = SKILL_LEVEL_FAMILIAR,
/singleton/skill/gardening = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/xenobotany = SKILL_LEVEL_PROFESSIONAL
)
/singleton/education/xenobiology_degree
name = "Xenobiology Degree"
description = "You are at least 30 years of age, with a PhD in Xenobiology. Your specialization is with discovering and cataloguing alien animals."
jobs = list("Xenobiologist")
minimum_character_age = list(
SPECIES_HUMAN = 30,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/research = SKILL_LEVEL_FAMILIAR,
/singleton/skill/xenobiology = SKILL_LEVEL_PROFESSIONAL
)
@@ -0,0 +1,67 @@
/singleton/education/forensics_degree
name = "Forensics Science Degree"
description = "You are 25 years of age or older, with a degree in Forensics Science. You specialize in the medical procedures required to understand why someone died. " \
+ "While not necessarily a medical degree, there's not much difference in suturing a body whether or not its approaching room temperature."
jobs = list("Investigator")
minimum_character_age = list(
SPECIES_HUMAN = 25,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/surgery = SKILL_LEVEL_TRAINED,
/singleton/skill/anatomy = SKILL_LEVEL_FAMILIAR,
/singleton/skill/forensics = SKILL_LEVEL_PROFESSIONAL,
/singleton/skill/firearms = SKILL_LEVEL_TRAINED
)
/singleton/education/military_basic
name = "Military Training"
description = "You have finished at least one full contract of military service. Alternatively, this could be equivalent experience from mercenary work (legal or otherwise), \
or or simply surviving for long in a grim environment where self-discipline matters as much as skill."
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/unarmed_combat = SKILL_LEVEL_TRAINED,
/singleton/skill/armed_combat = SKILL_LEVEL_TRAINED,
/singleton/skill/firearms = SKILL_LEVEL_TRAINED
)
/singleton/education/military_corpsman
name = "Corpsman Training"
description = "After completing basic military training (or having lived a life that taught you comparable lessons), you received advanced individual training in battlefield medicine. " \
+ "Your combat skills are not as sharp as others, but you made up for it by knowing how to keep your comrades in arms from bleeding out on the battlefield. " \
+ "A character with this training is NOT legally considered a medical doctor. You're on the hook for manslaughter if you attempt and fail to save them yourself instead of taking them to a real doctor."
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/* Significantly worse combat skills than other security educations, though not so bad they'll footgun themselves.
Alternatively, this is a plausible though less specialized alternative for paramedic training, as is common in real life. */
/singleton/skill/armed_combat = SKILL_LEVEL_FAMILIAR,
/singleton/skill/firearms = SKILL_LEVEL_TRAINED,
/singleton/skill/surgery = SKILL_LEVEL_FAMILIAR, /* Only enough to repair an artery. */
/singleton/skill/medicine = SKILL_LEVEL_FAMILIAR
)
/singleton/education/police_academy
name = "Police Academy Graduate"
description = "You are a police academy graduate, or else you have certified through (or survived) a local institution of comparable sort. \
Your combat skills are not as stringent as actual military service, though this is made up for with more generalized training suitable for a first-responder."
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 60,
SPECIES_SKRELL_AXIORI = 60
)
skills = list(
/singleton/skill/unarmed_combat = SKILL_LEVEL_FAMILIAR,
/singleton/skill/firearms = SKILL_LEVEL_TRAINED,
/singleton/skill/forensics = SKILL_LEVEL_FAMILIAR, /* Very basic crime investigation skills. */
/singleton/skill/medicine = SKILL_LEVEL_FAMILIAR /* Police are also trained in basic first aid. */
)
@@ -0,0 +1,68 @@
/singleton/education/mixing
name = "Mixologist"
description = "You know everyone's favorite and how to make it. Whether you successfully passed the test for an Idris mixing license or have tended enough bars to have seen it all, \
you are a specialist in mixing cocktails, mocktails, and whatever else. Time to mix drinks and save lives."
jobs = list("Bartender")
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 50,
SPECIES_SKRELL_AXIORI = 50
)
skills = list(
/singleton/skill/bartending = SKILL_LEVEL_PROFESSIONAL,
)
/singleton/education/cooking_degree
name = "Culinary Artist"
description = "You possibly obtained a degree in Culinary Arts or else you've survived enough kitchens to compete with the best. Pancakes, steaks, and cultural food - you've learnt about how to cook it all."
jobs = list("Chef")
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 50,
SPECIES_SKRELL_AXIORI = 50
)
skills = list(
/singleton/skill/cooking = SKILL_LEVEL_PROFESSIONAL,
)
/singleton/education/cooking_certification
name = "Culinary Background"
description = "You either obtained an Idris certification to work as a cook, or you've been on dinner duty for a long enough time to get pretty good at it. \
You won't be as good as a professional chef, but you can pour your soul out into a good breakfast."
jobs = list("Chef")
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 50,
SPECIES_SKRELL_AXIORI = 50
)
skills = list(
/singleton/skill/cooking = SKILL_LEVEL_TRAINED,
)
/singleton/education/hydroponics_degree
name = "Hydroponics Specialization"
description = "You either obtained a degree to work as a hydroponicist or gardener or you have enough of a gift and the experience that you could do just as well. \
Your background covered both manual and hydroponics gardening of just about every plant known to your species, alongside plants that are more typical to other cultures in the Spur."
jobs = list("Gardener")
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 50,
SPECIES_SKRELL_AXIORI = 50
)
skills = list(
/singleton/skill/gardening = SKILL_LEVEL_PROFESSIONAL,
)
/singleton/education/hydroponics_certification
name = "Hydroponics Background"
description = "You either obtained an Idris certification to work as a hydroponicist or gardener, or you have worked with enough plant life to hit the same mark. \
Although you might not be as much of an expert as someone with a Hydroponics degree, you can still plant just about everything if you give it your all."
jobs = list("Gardener")
minimum_character_age = list(
SPECIES_HUMAN = 18,
SPECIES_SKRELL = 50,
SPECIES_SKRELL_AXIORI = 50
)
skills = list(
/singleton/skill/gardening = SKILL_LEVEL_TRAINED,
)
+5 -1
View File
@@ -1,11 +1,15 @@
/singleton/origin_item
var/name = "generic origin item"
var/desc = DESC_PARENT
var/important_information //Big red text. Should only be used if not following it would incur a bwoink.
/// Big red text. Should only be used if not following it would incur a bwoink.
var/important_information
/// A list of the origin traits given by this culture item.
var/list/origin_traits = list()
/// Format for the following list: "Characters from this origin: [list entry], [list entry]."
/// One list item per trait.
var/list/origin_traits_descriptions = list()
/// A list of skills given by this origin. Assoc list of skill singleton type to level.
var/list/given_skills = list()
/singleton/origin_item/culture
name = "generic culture"