Proficiencies
Proficiencies are specializations or fields of expertise a character may have. Having a proficiency makes a character more time-efficient and successful at activities and crafts related to it.
Skills and proficiencies
Proficiencies are entirely distinct from skills, and are not directly associated with them; they are a separate system of tracking more specific subsets of knowledge. Most proficiencies will have an obvious general affiliation with one or more skills, but this is loose.
Most skills in CDDA (particularly the non-combat ones) represent broad sets of transferable knowledge, while proficiencies are narrower and more focused. By keeping them mechanically separate from skills we are able to represent, for example, that being proficient in construction may have a role in fabricating things out of wood, or constructing survival shelters along similar principles, regardless of what level fabrication or survival skill happen to be.
You could think of this as a three tiered system:
- Top tier - skill - very large and broad areas of knowledge
- Mid tier - proficiency - more focused and specific areas of knowledge
- Bottom tier - recipes - very specific single-focus areas of knowledge
Proficiency trees or graphs
Many proficiencies naturally align into a tree, with basic proficiencies branching into detailed specializations. For example, part of a metalworking proficiency tree:
- Principles of Metalworking
- Principles of Welding
- Welding
- Blacksmithing
- Armorsmithing
- Bladesmithing
- Manual Tooling
- Redsmithing
- Wire Making
- Principles of Welding
One must be fully proficient in Principles of Metalworking before learning any other proficiencies within this tree. Similarly, Blacksmithing proficiency must be acquired before Armorsmithing, Bladesmithing, or Manual Tooling can be studied - but those sub-proficiencies may be learned in parallel, once the required Blacksmithing proficiency is achieved.
However, while related proficiencies may tend to follow a tree structure, the system of proficiencies is actually a dependency graph; each proficiency may require or depend on any number of other proficiencies.
For example, Antique Gunsmithing requires Principles of Metalworking, and also Principles of Gunsmithing. Similarly, Gem Setting requires both Redsmithing and Fine Metalsmithing. This graph structure makes proficiencies a powerful way of expressing complex requirements for many kinds of activities a survivor might do.
Effects of gaining proficiency
Crafting recipes may involve any number of proficiencies, in addition to whatever skill requirements and difficulty they may have. When proficiencies are used in recipes, they can affect the crafting time and chance of failure, depending on how many of those proficiencies the character has, and how well they know them.
Proficiencies may apply bonuses to certain activities. The effects of these bonuses must be hardcoded to the activity in question, but the kind of bonus and the strength of its effect can be described as part of the proficiency (see below).
While a character is learning a proficiency, a percentage is displayed next to it showing how much of it has been learned. When it reaches 100%, they become fully “proficient” at that ability, and will do activities and crafting with that proficiency at maximum speed with minimal failures.
Before reaching 100%, there are some penalties to time and success. The extra time and chance to fail are computed using separate formulas and their multipliers may be given separately in the proficiency JSON and any recipes using them.
Proficiency categories
In order to better organize proficiencies in the in-game UI, each proficiency belongs to a specific category pointing to a JSON defined "proficiency_category"
object:
{
"type": "proficiency_category",
"id": "prof_archery",
"name": "Archery",
"description": "Proficiencies for all things bow and arrows. Includes knowledge and experience of making and modifying bows, as well as archery form and posture."
}
Definition
Proficiencies are defined in JSON files in the data/json/proficiencies
directory. Files are named according to a conceptual classification of proficiencies within; they may relate to the names of skills, but don’t have to. For example some are named “metalwork”, “wilderness”, and “woodworking”.
Within these are the standard list of JSON objects having “type”: “proficiency”. For example:
[
{
"type": "proficiency",
"id": "prof_bow_master",
"category": "prof_archery",
"name": { "str": "Master Archer's Form" },
"description": "You are a master at the art of Archery.",
"can_learn": true,
"teachable": true,
"time_to_learn": "20 h",
"default_time_multiplier": 1.5,
"default_skill_penalty": 0.2,
"required_proficiencies": [ "prof_bow_expert" ],
"bonuses": { "archery": [ { "type": "strength", "value": 1 } ] }
}
]
JSON fields
field | mandatory | type | description |
---|---|---|---|
id | Mandatory | String | Internal id of the proficiency, used for all JSON and code references to it. |
type | Mandatory | String | Must be proficiency for all proficiencies. |
category | Mandatory | String | Internal id of the associated proficiency_category object. |
name | Mandatory | String | Name of the proficiency, used for all in-game display. |
description | Mandatory | String | Description of what abilities or special knowledge the proficiency entails. |
can_learn | Mandatory | Bool | Whether or not this proficiency can be learned through normal means during the game. |
teachable | Optional | Bool | Whether it’s possible to teach this proficiency between characters. (Default = true) |
default_time_multiplier | Optional | Float | Time multiplier for crafting recipes (see below). |
default_skill_penalty | Optional | Float | Effective skill penalty for crafting recipes (see below). |
default_weakpoint_bonus | Optional | Float | Flat bonus to the attacker’s skill. |
default_weakpoint_penalty | Optional | Float | Flat penalty to the attacker’s skill if they lack the skill. |
time_to_learn | Optional | time_duration, as a string | The (optimal) time required to learn this proficiency. |
required_proficiencies | Optional | Array of strings | The proficiencies that must be obtained before this one can. You cannot gain experience in a proficiency without the necessary prerequisites. |
ignore_focus | Optional | Bool | Proficiency exp gain will be as if focus is 100 regardless of actual focus. |
bonuses | Optional | Object, with an array of object as values | This member is used to apply bonuses to certain activities given the player has a particular proficiency. The bonuses applied must be hardcoded to the activity in question. (see below) |
time multiplier and skill penalty
Regarding default_time_multiplier
and default_skill_penalty
, these specify the maximum penalty for lacking the proficiency when crafting a recipe that involves it.
- For proficiencies that represent core basic knowledge and foundational principles, the
time
multiplier should usually be low (1.5 or so), and theskill
penalty should be lower (0.4 or more). - For “flavor” proficiencies that offer a small boost, these should be around 1.5 for time and 0 to 0.1 for skill.
- Most other proficiencies should be in the 2-3 range for time values and 0.2-0.3 for skill.
- In general skill penalties should range from 0.1 to 0.5, while time rates should range from 1.5 to 5.
bonuses
The keys of the bonuses
object correspond to what bonuses are - e.g. the archery
key marks bonuses used for archery
. The general format is:
"bonuses": {
"key": [ { "type": "string", "value": float } ]
}
Using the example from above:
"bonuses": {
"archery": [ { "type": "strength", "value": 1 } ]
}
The values of the keys are an array of objects constructed as so:
Field | Mandatory | Type | Description |
---|---|---|---|
type | Mandatory | String | Where this bonus applies. Valid values are "strength" , "dexterity" , "intelligence" , "perception" . |
value | Mandatory | Float | What the bonus is. This can be any numeric value representable as a floating point number. Values of the same type from all available proficiencies are summed together to produce the final bonus for a proficiency. |
For the melee_attack
key, only "type": "stamina"
is valid, and when an attack is performed using a weapon category that points to this proficiency, the final stamina cost of the attack will be multiplied by 1 - (the sum of stamina bonuses). This does not stack across categories, and only the lowest resulting stamina value will be used.