Data Structures
All runtime data structures live in the SimpleSkillForge namespace and are
[Serializable] structs. The Skill Forge uses a two-level property
system (skill-level + rank-level), while the Tree, Set, and Combo forges use single-level properties.
SimpleSkillDefinition
The main skill entry. Contains identity, two-level dynamic properties, nested ranks,
prerequisites, modifier references, and 12 cross-forge reference fields.
Identity Fields
| Field | Type | Description |
code | string | Unique identifier (SCREAMING_SNAKE_CASE) |
displayName | string | Human-readable name |
description | string | Skill description text |
icon | Sprite | Skill icon |
Skill-Level Dynamic Properties (Level 1)
| Field | Type | Description |
categoryValues | int[] | Category indices (one per category definition) |
flagValues | bool[] | Boolean flags (one per flag definition) |
numericValues | float[] | Numeric values (one per numeric definition) |
textValues | string[] | Text values (one per text definition) |
Nested Data
| Field | Type | Description |
ranks | SimpleSkillRank[] | Per-rank data with Level 2 properties |
prerequisites | SimpleSkillPrerequisite[] | Unlock conditions |
modifiers | ScriptableObject[] | SAF modifier assets (passive effects) |
Cross-Forge References: SIF (Item Forge)
| Field | Type | Description |
grantedByItemCode | string | Item that teaches/grants this skill (skill books, scrolls, equipment passives) |
requiredEquipmentCode | string | Item that must be equipped to use this skill (weapon requirements) |
producesItemCode | string | Item created when this skill is used (conjure food, crafting skills) |
reagentCosts | SimpleSkillReagentCost[] | Items consumed per cast (arrows, soul shards, catalysts) |
Cross-Forge References: SEF (Enemy Forge)
| Field | Type | Description |
summonEnemyCode | string | Enemy summoned by this skill (necromancer minions, pet classes) |
learnedFromEnemyCode | string | Enemy that teaches this skill (Blue Mage, monster absorption) |
taughtByNPCCode | string | NPC trainer that teaches this skill (class trainers, skill masters) |
effectiveAgainstFactions | string[] | Factions this skill is strong against (Holy vs Undead, type advantages) |
restrictedToFactionCode | string | Only characters of this faction can use this skill |
Cross-Forge References: SQF (Quest Forge)
| Field | Type | Description |
unlockedByQuestCode | string | Quest that must be completed to learn this skill |
rewardedByQuestCodes | string[] | Quests that award this skill as a reward |
Cross-Forge References: SAF Character Templates
| Field | Type | Description |
allowedCharacterClasses | string[] | Character class names this skill is restricted to. Empty = usable by all classes. |
Accessor Methods
| Method | Returns | Description |
GetCategoryValue(int index) | int | Safe category access (returns 0 if out of range) |
GetFlagValue(int index) | bool | Safe flag access (returns false if out of range) |
GetNumericValue(int index) | float | Safe numeric access (returns 0f if out of range) |
GetTextValue(int index) | string | Safe text access (returns "" if out of range) |
GetMaxRank() | int | Returns the maximum rank number defined for this skill |
GetRank(int rankNumber) | SimpleSkillRank? | Returns rank data for a specific rank number, or null |
Convenience Properties
| Property | Type | Description |
IsItemGranted | bool | True if grantedByItemCode is set |
HasEquipmentRequirement | bool | True if requiredEquipmentCode is set |
ProducesItem | bool | True if producesItemCode is set |
HasReagentCosts | bool | True if reagentCosts has entries |
IsSummonSkill | bool | True if summonEnemyCode is set |
IsEnemyLearned | bool | True if learnedFromEnemyCode is set |
HasTrainer | bool | True if taughtByNPCCode is set |
HasFactionEffectiveness | bool | True if effectiveAgainstFactions has entries |
IsFactionRestricted | bool | True if restrictedToFactionCode is set |
IsQuestUnlocked | bool | True if unlockedByQuestCode is set |
IsQuestRewarded | bool | True if rewardedByQuestCodes has entries |
HasClassRestriction | bool | True if allowedCharacterClasses has entries |
Query Methods
| Method | Returns | Description |
IsUsableByClass(string className) | bool | True if unrestricted or className is in allowedCharacterClasses |
IsEffectiveAgainst(string factionCode) | bool | True if factionCode is in effectiveAgainstFactions |
IsRewardedByQuest(string questCode) | bool | True if questCode is in rewardedByQuestCodes |
SimpleSkillRank
A single rank of a skill. Each rank has its own rank-level dynamic properties (Level 2),
upgrade costs, and optional SAF modifier references.
| Field | Type | Description |
rank | int | Rank number (starts at 1, not an index) |
categoryValues | int[] | Rank-level category indices |
flagValues | bool[] | Rank-level boolean flags |
numericValues | float[] | Rank-level numeric values |
textValues | string[] | Rank-level text values |
upgradeCosts | SimpleSkillUpgradeCost[] | Resources required to reach this rank |
modifiers | ScriptableObject[] | SAF modifier assets gained at this rank |
Accessor Methods
| Method | Returns | Description |
GetCategoryValue(int index) | int | Safe category access (returns 0 if out of range) |
GetFlagValue(int index) | bool | Safe flag access (returns false if out of range) |
GetNumericValue(int index) | float | Safe numeric access (returns 0f if out of range) |
GetTextValue(int index) | string | Safe text access (returns "" if out of range) |
SimpleSkillUpgradeCost
A resource cost for upgrading a skill to a specific rank. The resourceCode can reference an item code (SIF),
attribute code (SAF), or any custom string.
| Field | Type | Description |
resourceCode | string | Identifier of the required resource |
amount | float | Quantity required |
SimpleSkillReagentCost
An item consumed each time the skill is used. Different from SimpleSkillUpgradeCost which is
for leveling/ranking up.
| Field | Type | Description |
itemCode | string | Item code consumed per cast |
amount | int | Quantity consumed per cast |
SimpleSkillPrerequisite
A prerequisite condition for unlocking a skill. Evaluated as:
valueProvider(targetCode) [comparison] value
| Field | Type | Description |
targetCode | string | Code to evaluate (skill code, attribute code, quest code, or custom) |
comparison | SimpleSkillComparison | Comparison operator |
value | float | Threshold value to compare against |
SimpleSkillComparison (enum)
Comparison operators for prerequisite evaluation.
| Value | Meaning |
Equals | Current value equals target (using Mathf.Approximately) |
NotEquals | Current value does not equal target |
GreaterThan | Current value is greater than target |
LessThan | Current value is less than target |
GreaterOrEqual | Current value is greater than or equal to target |
LessOrEqual | Current value is less than or equal to target |
SimpleSkillTreeDefinition
A complete skill tree with identity, nodes, connections, and single-level dynamic properties.
Fields
| Field | Type | Description |
code | string | Unique identifier |
displayName | string | Human-readable name |
description | string | Tree description text |
icon | Sprite | Tree icon |
nodes | SimpleSkillTreeNode[] | All nodes in this tree |
connections | SimpleSkillTreeConnection[] | Directed edges between nodes |
categoryValues | int[] | Category indices |
flagValues | bool[] | Boolean flags |
numericValues | float[] | Numeric values |
textValues | string[] | Text values |
allowedCharacterClasses | string[] | Class restrictions (empty = unrestricted) |
Accessor Methods
| Method | Returns | Description |
GetCategoryValue(int index) | int | Safe category access (returns -1 if out of range) |
GetFlagValue(int index) | bool | Safe flag access (returns false if out of range) |
GetNumericValue(int index) | float | Safe numeric access (returns 0f if out of range) |
GetTextValue(int index) | string | Safe text access (returns "" if out of range) |
GetNodeById(int nodeId) | SimpleSkillTreeNode? | Find a node by its ID, or null |
GetNodesInBranch(string branchGroup) | SimpleSkillTreeNode[] | Get all nodes in a branch group |
GetBranchGroups() | string[] | Get all unique branch group names |
GetConnectionsFrom(int nodeId) | SimpleSkillTreeConnection[] | Get connections from a node (children) |
GetConnectionsTo(int nodeId) | SimpleSkillTreeConnection[] | Get connections to a node (parents) |
GetParentNodeIds(int nodeId) | int[] | Get parent node IDs |
GetChildNodeIds(int nodeId) | int[] | Get child node IDs |
GetRootNodes() | SimpleSkillTreeNode[] | Get nodes with no parent connections |
ContainsSkill(string skillCode) | bool | Check if any node references this skill code |
IsAvailableToClass(string className) | bool | True if unrestricted or className is allowed |
Convenience Properties
| Property | Type | Description |
NodeCount | int | Number of nodes |
ConnectionCount | int | Number of connections |
HasClassRestriction | bool | True if allowedCharacterClasses has entries |
SimpleSkillTreeNode
A single node in a skill tree. References a skill code and defines grid position,
unlock requirements, and branch membership.
| Field | Type | Description |
nodeId | int | Unique identifier within this tree |
skillCode | string | Skill code from a linked Skill Forge database |
row | int | Row position in the tree grid (visual layout) |
column | int | Column position in the tree grid (visual layout) |
pointCost | int | Skill points required to unlock this node |
requiredLevel | int | Minimum character level required |
requiredPointsInTree | int | Minimum total points spent in this tree to unlock |
branchGroup | string | Specialization path identifier (e.g., "Fire", "Ice"). Empty = no branch. |
isRequired | bool | Must this node be unlocked to proceed down the branch? |
SimpleSkillTreeConnection
A directed edge in a skill tree: parent to child unlock dependency.
The child node cannot be unlocked until the parent is unlocked.
| Field | Type | Description |
fromNodeId | int | Source node ID (must be unlocked first) |
toNodeId | int | Target node ID (unlockable after parent) |
SimpleSkillSetDefinition
A complete skill set with identity, slots, threshold-based bonuses, and single-level dynamic properties.
Fields
| Field | Type | Description |
code | string | Unique identifier |
displayName | string | Human-readable name |
description | string | Set description text |
icon | Sprite | Set icon |
slots | SimpleSkillSetSlot[] | Typed skill slots |
bonuses | SimpleSkillSetBonus[] | Threshold-based set bonuses |
categoryValues | int[] | Category indices |
flagValues | bool[] | Boolean flags |
numericValues | float[] | Numeric values |
textValues | string[] | Text values |
allowedCharacterClasses | string[] | Class restrictions (empty = unrestricted) |
Accessor Methods
| Method | Returns | Description |
GetCategoryValue(int index) | int | Safe category access (returns -1 if out of range) |
GetFlagValue(int index) | bool | Safe flag access |
GetNumericValue(int index) | float | Safe numeric access |
GetTextValue(int index) | string | Safe text access |
GetSlotTypes() | string[] | Get all unique slot type labels |
GetSlotsByType(string slotType) | SimpleSkillSetSlot[] | Get all slots of a specific type |
ContainsSkill(string skillCode) | bool | Check if any slot references this skill code |
GetSkillCodes() | string[] | Get all non-empty skill codes from slots |
GetBonusForCount(int equippedCount) | SimpleSkillSetBonus? | Get the highest-threshold bonus for a given count |
GetActiveBonuses(int equippedCount) | SimpleSkillSetBonus[] | Get all bonuses active for a given count |
IsAvailableToClass(string className) | bool | True if unrestricted or className is allowed |
Convenience Properties
| Property | Type | Description |
SlotCount | int | Number of slots |
BonusCount | int | Number of bonuses |
RequiredSlotCount | int | Number of required slots |
HasClassRestriction | bool | True if allowedCharacterClasses has entries |
SimpleSkillSetSlot
A single slot in a skill set, with a type label, skill reference, and required flag.
| Field | Type | Description |
slotType | string | Slot type label (e.g., "Active1", "Passive1", "Ultimate") |
skillCode | string | Skill code from a linked Skill Forge database |
isRequired | bool | Whether this slot must be filled for the set to be valid |
SimpleSkillSetBonus
A threshold-based bonus that activates when enough skills from the set are equipped.
| Field | Type | Description |
requiredCount | int | Number of equipped skills required to activate |
bonusDescription | string | Human-readable description of the bonus effect |
modifiers | ScriptableObject[] | SAF modifier assets applied when this bonus activates |
SimpleSkillComboDefinition
A complete skill combo with identity, ordered steps, threshold-based rewards, and single-level dynamic properties.
Fields
| Field | Type | Description |
code | string | Unique identifier |
displayName | string | Human-readable name |
description | string | Combo description text |
icon | Sprite | Combo icon |
steps | SimpleSkillComboStep[] | Ordered steps in the combo sequence |
rewards | SimpleSkillComboReward[] | Threshold-based rewards |
categoryValues | int[] | Category indices |
flagValues | bool[] | Boolean flags |
numericValues | float[] | Numeric values |
textValues | string[] | Text values |
allowedCharacterClasses | string[] | Class restrictions (empty = unrestricted) |
Accessor Methods
| Method | Returns | Description |
GetCategoryValue(int index) | int | Safe category access (returns -1 if out of range) |
GetFlagValue(int index) | bool | Safe flag access |
GetNumericValue(int index) | float | Safe numeric access |
GetTextValue(int index) | string | Safe text access |
GetStepByIndex(int index) | SimpleSkillComboStep? | Get step by index, or null if out of range |
ContainsSkill(string skillCode) | bool | Check if any step references this skill (primary or alternates) |
GetAllSkillCodes() | string[] | Get all unique skill codes from all steps |
GetActiveRewards(int completedStepCount) | SimpleSkillComboReward[] | Get rewards active for a given step count |
FindStepsBySkillCode(string skillCode) | SimpleSkillComboStep[] | Find all steps matching a skill code (primary or alternates) |
IsAvailableToClass(string className) | bool | True if unrestricted or className is allowed |
Convenience Properties
| Property | Type | Description |
StepCount | int | Number of steps |
RewardCount | int | Number of rewards |
HasClassRestriction | bool | True if allowedCharacterClasses has entries |
SimpleSkillComboStep
A single step in a combo chain, with a primary skill, alternates, branch grouping, and timing.
| Field | Type | Description |
skillCode | string | Primary skill code for this step |
isRequired | bool | Must this step be hit, or can it be skipped? |
alternateSkillCodes | string[] | Alternative skill codes that also satisfy this step |
branchGroup | string | Steps in the same branch group are OR alternatives |
maxDelay | float | Max seconds before the combo drops (0 = no limit) |
sortOrder | int | Sort order for step sequencing |
SimpleSkillComboReward
A threshold-based reward that activates when enough combo steps are completed.
| Field | Type | Description |
requiredSteps | int | Number of completed steps required to earn this reward |
rewardDescription | string | Human-readable description of the reward effect |
effectCode | string | Game-specific effect identifier |
modifiers | ScriptableObject[] | SAF modifier assets applied when this reward triggers |
Interfaces
Each forge generates a ScriptableObject database class that implements one of these interfaces.
Cast your generated database asset to the interface for type-safe access.
// Cast a ScriptableObject to the interface
var db = skillDatabaseAsset as ISimpleSkillDataSource;
var fireball = db.GetSkillByCode("FIREBALL");
ISimpleSkillDataSource
Interface for generated skill databases. Supports two-level dynamic properties (skill-level + rank-level).
Skill Access
| Member | Returns | Description |
SkillCount | int | Total number of skills |
GetSkillDefinitions() | SimpleSkillDefinition[] | All skill definitions |
GetSkillByCode(string code) | SimpleSkillDefinition? | Skill by code, or null |
GetSkillCodes() | string[] | All skill codes |
GetSkillNames() | string[] | All skill display names |
HasSkill(string code) | bool | Check if a skill exists |
GetSkillEnumType() | Type | The generated enum type for skill codes |
Rank Access
| Method | Returns | Description |
GetRanksForSkill(string skillCode) | SimpleSkillRank[] | All ranks for a skill |
GetMaxRank(string skillCode) | int | Max rank number for a skill |
Skill-Level Property Definitions (Level 1)
| Method | Returns | Description |
GetCategoryLabels() | string[] | Labels for skill-level categories |
GetCategoryEntries(int index) | string[] | Entries for a skill-level category |
GetFlagNames() | string[] | Names of skill-level flags |
GetNumericNames() | string[] | Names of skill-level numerics |
GetTextNames() | string[] | Names of skill-level texts |
Rank-Level Property Definitions (Level 2)
| Method | Returns | Description |
GetRankCategoryLabels() | string[] | Labels for rank-level categories |
GetRankCategoryEntries(int index) | string[] | Entries for a rank-level category |
GetRankFlagNames() | string[] | Names of rank-level flags |
GetRankNumericNames() | string[] | Names of rank-level numerics |
GetRankTextNames() | string[] | Names of rank-level texts |
Dynamic Filtering
| Method | Returns | Description |
GetSkillsByCategory(int categoryIndex, int entryIndex) | SimpleSkillDefinition[] | Skills matching a category value |
GetSkillsByFlag(int flagIndex, bool value) | SimpleSkillDefinition[] | Skills matching a flag value |
GetSkillsByNumericRange(int numericIndex, float min, float max) | SimpleSkillDefinition[] | Skills with a numeric in the given range |
Cross-Reference Queries
| Method | Returns | Description |
GetSkillsWithPrerequisite(string targetCode) | SimpleSkillDefinition[] | Skills requiring a specific target code |
GetSkillsWithUpgradeCost(string resourceCode) | SimpleSkillDefinition[] | Skills using a resource in any rank's upgrade costs |
Cross-Forge Queries: SIF
| Method | Returns | Description |
GetSkillsGrantedByItem(string itemCode) | SimpleSkillDefinition[] | Skills granted by a specific item |
GetSkillsRequiringEquipment(string itemCode) | SimpleSkillDefinition[] | Skills requiring a specific item equipped |
GetSkillsProducingItem(string itemCode) | SimpleSkillDefinition[] | Skills that produce a specific item |
GetSkillsConsumingReagent(string itemCode) | SimpleSkillDefinition[] | Skills consuming a specific reagent item |
Cross-Forge Queries: SEF
| Method | Returns | Description |
GetSkillsSummoningEnemy(string enemyCode) | SimpleSkillDefinition[] | Skills that summon a specific enemy |
GetSkillsLearnedFromEnemy(string enemyCode) | SimpleSkillDefinition[] | Skills learned from a specific enemy |
GetSkillsTaughtByNPC(string npcCode) | SimpleSkillDefinition[] | Skills taught by a specific NPC trainer |
GetSkillsEffectiveAgainstFaction(string factionCode) | SimpleSkillDefinition[] | Skills effective against a specific faction |
GetSkillsRestrictedToFaction(string factionCode) | SimpleSkillDefinition[] | Skills restricted to a specific faction |
Cross-Forge Queries: SQF
| Method | Returns | Description |
GetSkillsUnlockedByQuest(string questCode) | SimpleSkillDefinition[] | Skills unlocked by completing a specific quest |
GetSkillsRewardedByQuest(string questCode) | SimpleSkillDefinition[] | Skills rewarded by a specific quest |
Cross-Forge Queries: SAF Character Templates
| Method | Returns | Description |
GetSkillsForClass(string className) | SimpleSkillDefinition[] | Skills restricted to a specific class |
GetSkillsUsableByClass(string className) | SimpleSkillDefinition[] | Skills usable by a class (restricted to that class + unrestricted) |
ISimpleSkillTreeDataSource
Interface for generated skill tree databases. Supports single-level dynamic properties on trees.
Tree Access
| Member | Returns | Description |
TreeCount | int | Number of trees |
GetAllTrees() | SimpleSkillTreeDefinition[] | All tree definitions |
GetTreeByCode(string code) | SimpleSkillTreeDefinition? | Tree by code, or null |
GetTreeCodes() | string[] | All tree codes |
GetTreeNames() | string[] | All tree display names |
HasTree(string code) | bool | Check if a tree exists |
GetTreeEnumType() | Type | The generated enum type for tree codes |
Node and Connection Access
| Method | Returns | Description |
GetNodesForTree(string treeCode) | SimpleSkillTreeNode[] | All nodes for a tree |
GetConnectionsForTree(string treeCode) | SimpleSkillTreeConnection[] | All connections for a tree |
GetBranchGroups(string treeCode) | string[] | Unique branch group names in a tree |
Property Definitions (Single-Level)
| Method | Returns | Description |
GetCategoryLabels() | string[] | Category labels |
GetCategoryEntries(int categoryIndex) | string[] | Entries for a category |
GetFlagNames() | string[] | Flag names |
GetNumericNames() | string[] | Numeric property names |
GetTextNames() | string[] | Text property names |
Dynamic Filtering
| Method | Returns | Description |
GetTreesByCategory(int categoryIndex, int entryIndex) | SimpleSkillTreeDefinition[] | Trees matching a category value |
GetTreesByFlag(int flagIndex, bool value) | SimpleSkillTreeDefinition[] | Trees matching a flag value |
GetTreesByNumericRange(int numericIndex, float min, float max) | SimpleSkillTreeDefinition[] | Trees with a numeric in the given range |
Cross-Reference and Class Queries
| Method | Returns | Description |
FindTreesContainingSkill(string skillCode) | SimpleSkillTreeDefinition[] | Trees containing a node with the given skill code |
GetTreesForClass(string className) | SimpleSkillTreeDefinition[] | Trees restricted to a specific class |
GetTreesAvailableToClass(string className) | SimpleSkillTreeDefinition[] | Trees available to a class (restricted + unrestricted) |
ISimpleSkillSetDataSource
Interface for generated skill set databases. Supports single-level dynamic properties on sets.
Set Access
| Member | Returns | Description |
SetCount | int | Number of sets |
GetAllSets() | SimpleSkillSetDefinition[] | All set definitions |
GetSetByCode(string code) | SimpleSkillSetDefinition? | Set by code, or null |
GetSetCodes() | string[] | All set codes |
GetSetNames() | string[] | All set display names |
HasSet(string code) | bool | Check if a set exists |
GetSetEnumType() | Type | The generated enum type for set codes |
Slot and Bonus Access
| Method | Returns | Description |
GetSlotsForSet(string setCode) | SimpleSkillSetSlot[] | All slots for a set |
GetBonusesForSet(string setCode) | SimpleSkillSetBonus[] | All bonuses for a set |
Property Definitions (Single-Level)
| Method | Returns | Description |
GetCategoryLabels() | string[] | Category labels |
GetCategoryEntries(int categoryIndex) | string[] | Entries for a category |
GetFlagNames() | string[] | Flag names |
GetNumericNames() | string[] | Numeric property names |
GetTextNames() | string[] | Text property names |
Dynamic Filtering
| Method | Returns | Description |
GetSetsByCategory(int categoryIndex, int entryIndex) | SimpleSkillSetDefinition[] | Sets matching a category value |
GetSetsByFlag(int flagIndex, bool value) | SimpleSkillSetDefinition[] | Sets matching a flag value |
GetSetsByNumericRange(int numericIndex, float min, float max) | SimpleSkillSetDefinition[] | Sets with a numeric in the given range |
Cross-Reference and Class Queries
| Method | Returns | Description |
FindSetsContainingSkill(string skillCode) | SimpleSkillSetDefinition[] | Sets containing a slot with the given skill code |
GetSetsForClass(string className) | SimpleSkillSetDefinition[] | Sets restricted to a specific class |
GetSetsAvailableToClass(string className) | SimpleSkillSetDefinition[] | Sets available to a class (restricted + unrestricted) |
ISimpleSkillComboDataSource
Interface for generated skill combo databases. Supports single-level dynamic properties on combos.
Combo Access
| Member | Returns | Description |
ComboCount | int | Number of combos |
GetAllCombos() | SimpleSkillComboDefinition[] | All combo definitions |
GetComboByCode(string code) | SimpleSkillComboDefinition? | Combo by code, or null |
GetComboCodes() | string[] | All combo codes |
GetComboNames() | string[] | All combo display names |
HasCombo(string code) | bool | Check if a combo exists |
GetComboEnumType() | Type | The generated enum type for combo codes |
Step and Reward Access
| Method | Returns | Description |
GetStepsForCombo(string comboCode) | SimpleSkillComboStep[] | All steps for a combo |
GetRewardsForCombo(string comboCode) | SimpleSkillComboReward[] | All rewards for a combo |
Cross-Reference and Class Queries
| Method | Returns | Description |
FindCombosContainingSkill(string skillCode) | SimpleSkillComboDefinition[] | Combos containing a step with the given skill (primary or alternates) |
FindCombosStartingWith(string skillCode) | SimpleSkillComboDefinition[] | Combos whose first step matches the given skill code |
GetCombosForClass(string className) | SimpleSkillComboDefinition[] | Combos restricted to a specific class |
GetCombosAvailableToClass(string className) | SimpleSkillComboDefinition[] | Combos available to a class (restricted + unrestricted) |
Property Definitions (Single-Level)
| Method | Returns | Description |
GetCategoryLabels() | string[] | Category labels |
GetCategoryEntries(int categoryIndex) | string[] | Entries for a category |
GetFlagNames() | string[] | Flag names |
GetNumericNames() | string[] | Numeric property names |
GetTextNames() | string[] | Text property names |
Dynamic Filtering
| Method | Returns | Description |
GetCombosByCategory(int categoryIndex, int entryIndex) | SimpleSkillComboDefinition[] | Combos matching a category value |
GetCombosByFlag(int flagIndex, bool value) | SimpleSkillComboDefinition[] | Combos matching a flag value |
GetCombosByNumericRange(int numericIndex, float min, float max) | SimpleSkillComboDefinition[] | Combos with a numeric in the given range |
Static Helpers
Stateless utility classes with pure functions. No instantiation needed — call methods directly
on the static class.
SimpleSkillHelper
Static utility class for prerequisite evaluation, upgrade cost queries, cross-reference lookups,
and rank-up affordability checks. All methods are pure functions.
Prerequisite Evaluation
| Method | Returns | Description |
CheckPrerequisite(SimpleSkillPrerequisite, Func<string, float>) | bool | Evaluate a single prerequisite condition |
CheckAllPrerequisites(SimpleSkillDefinition, Func<string, float>) | bool | Evaluate all prerequisites for a skill (ALL must pass) |
EvaluatePrerequisites(SimpleSkillDefinition, Func<string, float>) | PrerequisiteResult[] | Evaluate all prerequisites with detailed results (currentValue, passed) |
Upgrade Cost Queries
| Method | Returns | Description |
GetTotalUpgradeCost(SimpleSkillDefinition, string resourceCode, int fromRank, int toRank) | float | Total cost of a resource to upgrade between ranks |
GetAllResourceCodes(SimpleSkillDefinition) | string[] | All unique resource codes used across all ranks |
GetUpgradeCostsForRank(SimpleSkillDefinition, int rankNumber) | SimpleSkillUpgradeCost[] | Upgrade costs for a specific rank |
CanAffordRankUp(SimpleSkillDefinition, int currentRank, Func<string, float>) | bool | Check if player can afford upgrading to the next rank |
Cross-Reference Queries
| Method | Returns | Description |
FindSkillsByCategory(ISimpleSkillDataSource, int categoryIndex, int entryIndex) | SimpleSkillDefinition[] | Skills matching a category value |
FindSkillsRequiring(ISimpleSkillDataSource, string targetCode) | SimpleSkillDefinition[] | Skills with a specific prerequisite target code |
FindUnlockedSkills(ISimpleSkillDataSource, Func<string, float>) | List<SimpleSkillDefinition> | All skills whose prerequisites are met |
GetPrerequisiteChain(ISimpleSkillDataSource, string skillCode) | List<string> | Recursive prerequisite chain (all skills needed before target) |
Cross-Forge Queries: SIF (Item Forge)
| Method | Returns | Description |
FindSkillsGrantedByItem(ISimpleSkillDataSource, string itemCode) | SimpleSkillDefinition[] | Skills granted by a specific item |
FindSkillsRequiringEquipment(ISimpleSkillDataSource, string itemCode) | SimpleSkillDefinition[] | Skills requiring a specific item equipped |
FindSkillsProducingItem(ISimpleSkillDataSource, string itemCode) | SimpleSkillDefinition[] | Skills that produce a specific item |
FindSkillsConsumingReagent(ISimpleSkillDataSource, string itemCode) | SimpleSkillDefinition[] | Skills consuming a specific reagent item |
GetAllReagentItemCodes(ISimpleSkillDataSource) | string[] | All unique reagent item codes across all skills |
Cross-Forge Queries: SEF (Enemy Forge)
| Method | Returns | Description |
FindSkillsSummoningEnemy(ISimpleSkillDataSource, string enemyCode) | SimpleSkillDefinition[] | Skills summoning a specific enemy |
FindSkillsLearnedFromEnemy(ISimpleSkillDataSource, string enemyCode) | SimpleSkillDefinition[] | Skills learned from a specific enemy |
FindSkillsTaughtByNPC(ISimpleSkillDataSource, string npcCode) | SimpleSkillDefinition[] | Skills taught by a specific NPC trainer |
FindSkillsEffectiveAgainstFaction(ISimpleSkillDataSource, string factionCode) | SimpleSkillDefinition[] | Skills effective against a faction |
FindSkillsRestrictedToFaction(ISimpleSkillDataSource, string factionCode) | SimpleSkillDefinition[] | Skills restricted to a faction |
Cross-Forge Queries: SQF (Quest Forge)
| Method | Returns | Description |
FindSkillsUnlockedByQuest(ISimpleSkillDataSource, string questCode) | SimpleSkillDefinition[] | Skills unlocked by a quest |
FindSkillsRewardedByQuest(ISimpleSkillDataSource, string questCode) | SimpleSkillDefinition[] | Skills rewarded by a quest |
Cross-Forge Queries: SAF Character Templates
| Method | Returns | Description |
FindSkillsForClass(ISimpleSkillDataSource, string className) | SimpleSkillDefinition[] | Skills restricted to a specific class |
FindSkillsUsableByClass(ISimpleSkillDataSource, string className) | SimpleSkillDefinition[] | Skills usable by a class (restricted + unrestricted) |
Tree Node Lookup
| Method | Returns | Description |
GetSkillForTreeNode(ISimpleSkillDataSource, ISimpleSkillTreeDataSource, string treeCode, int nodeId) | SimpleSkillDefinition? | Convenience: get the skill definition for a tree node |
Usage Example
// Check if a player can learn a skill
Func<string, float> valueProvider = (code) => GetPlayerValue(code);
bool canLearn = SimpleSkillHelper.CheckAllPrerequisites(fireball, valueProvider);
// Get detailed results for UI display
var results = SimpleSkillHelper.EvaluatePrerequisites(fireball, valueProvider);
foreach (var r in results)
Debug.Log($"{r.prerequisite.targetCode}: {r.currentValue} - {(r.passed ? "MET" : "NOT MET")}");
// Check if player can afford rank-up
bool canAfford = SimpleSkillHelper.CanAffordRankUp(fireball, currentRank, resourceProvider);
// Get the full prerequisite chain
var chain = SimpleSkillHelper.GetPrerequisiteChain(db, "METEOR_STORM");
Debug.Log($"Must learn first: {string.Join(" > ", chain)}");
SimpleSkillComboEvaluator
Static utility class for evaluating combo progress, finding matching combos, and computing
next valid skills. Stateless — all methods are pure functions. Use this when you need
combo evaluation without instantiating a tracker.
Methods
| Method | Returns | Description |
EvaluateCombo(SimpleSkillComboDefinition, string[] usedSkillCodes) | ComboEvalResult | Evaluate a combo against a sequence of used skills |
FindMatchingCombos(ISimpleSkillComboDataSource, string[] recentSkillCodes) | ComboMatch[] | Find all combos that partially or fully match recent skills |
GetActiveRewards(SimpleSkillComboDefinition, int completedStepCount) | SimpleSkillComboReward[] | Get rewards active for a given step count |
GetNextValidSkills(SimpleSkillComboDefinition, int completedStepCount) | string[] | Get skill codes that would advance the combo from current position |
IsComboComplete(SimpleSkillComboDefinition, string[] usedSkillCodes) | bool | Check if a combo is fully complete |
GetComboProgress(SimpleSkillComboDefinition, string[] usedSkillCodes) | float | Get completion progress (0 to 1) |
Result Types
ComboEvalResult
| Field | Type | Description |
matchedStepCount | int | Number of steps matched |
totalStepCount | int | Total steps in the combo |
completionPercentage | float | Completion percentage (0 to 1) |
isComplete | bool | Whether all steps have been matched |
nextValidSkillCodes | string[] | Skills that would advance the combo |
ComboMatch
| Field | Type | Description |
comboCode | string | The combo code |
matchedSteps | int | Number of steps matched |
totalSteps | int | Total steps in the combo |
isComplete | bool | Whether the combo is fully complete |
Usage Example
// Evaluate a specific combo against recent skills
var result = SimpleSkillComboEvaluator.EvaluateCombo(combo,
new[] { "SLASH", "UPPERCUT" });
Debug.Log($"Progress: {result.completionPercentage:P0}");
Debug.Log($"Next valid: {string.Join(", ", result.nextValidSkillCodes)}");
// Find all matching combos in a database
var matches = SimpleSkillComboEvaluator.FindMatchingCombos(comboDb,
new[] { "SLASH", "UPPERCUT" });
foreach (var m in matches)
Debug.Log($"{m.comboCode}: {m.matchedSteps}/{m.totalSteps}");
State Trackers
Mutable runtime state managers. Instantiate them with a database reference, use methods
to modify state, subscribe to events for reactive updates, and create/restore snapshots
for save/load.
SimpleSkillTreeTracker
Tracks skill tree progression at runtime. Manages node unlocks, point spending,
prerequisite validation, cascade resets, and serializable snapshots.
Constructor
var tracker = new SimpleSkillTreeTracker(treeDatabase);
Events
| Event | Signature | Description |
OnNodeUnlocked | Action<string, int> | Fired when a node is unlocked (treeCode, nodeId) |
OnNodeReset | Action<string, int> | Fired when a node is reset/locked (treeCode, nodeId) |
OnTreeReset | Action<string> | Fired when an entire tree is reset (treeCode) |
OnPointsChanged | Action<string, int> | Fired when points spent changes (treeCode, newTotal) |
Properties
| Property | Type | Description |
Database | ISimpleSkillTreeDataSource | The tree database this tracker uses |
InitializedTreeCodes | string[] | All initialized tree codes |
Lifecycle Methods
| Method | Returns | Description |
InitializeTree(string treeCode) | bool | Initialize a tree for tracking. Required before unlock/query operations. |
IsTreeInitialized(string treeCode) | bool | Check if a tree has been initialized |
GetTreeState(string treeCode) | SimpleSkillTreeState | Get the runtime state object, or null |
Node Unlock Methods
| Method | Returns | Description |
CanUnlockNode(string treeCode, int nodeId, int playerLevel, int availablePoints) | bool | Check all prerequisites: parent nodes, level, points in tree, point cost |
UnlockNode(string treeCode, int nodeId, int playerLevel) | bool | Unlock a node (caller manages point deduction) |
IsNodeUnlocked(string treeCode, int nodeId) | bool | Check if a specific node is unlocked |
Query Methods
| Method | Returns | Description |
GetPointsSpent(string treeCode) | int | Total skill points spent in a tree |
GetPointsSpentInBranch(string treeCode, string branchGroup) | int | Points spent in a specific branch |
GetUnlockedNodeIds(string treeCode) | int[] | All unlocked node IDs for a tree |
GetAvailableNodeIds(string treeCode, int playerLevel, int availablePoints) | int[] | All node IDs that can currently be unlocked |
GetAllUnlockedSkillCodes() | string[] | All unlocked skill codes across all initialized trees |
IsSkillUnlocked(string skillCode) | bool | Check if a skill code is unlocked in any tree |
Reset Methods
| Method | Returns | Description |
ResetNode(string treeCode, int nodeId) | int | Reset a node and cascade to dependents. Returns points refunded. |
ResetTree(string treeCode) | int | Reset an entire tree. Returns points refunded. |
ClearAll() | void | Clear all tracked state |
Serialization
| Method | Returns | Description |
CreateSnapshot() | SimpleSkillTreeTrackerSnapshot | Export current state as a serializable snapshot |
RestoreFromSnapshot(SimpleSkillTreeTrackerSnapshot) | void | Restore state from a snapshot |
Usage Example
var tracker = new SimpleSkillTreeTracker(treeDatabase);
tracker.InitializeTree("WARRIOR_COMBAT");
tracker.OnNodeUnlocked += (tree, node) =>
Debug.Log($"Unlocked node {node} in {tree}");
// Check and unlock
if (tracker.CanUnlockNode("WARRIOR_COMBAT", 3, playerLevel: 10))
{
tracker.UnlockNode("WARRIOR_COMBAT", 3, playerLevel: 10);
int spent = tracker.GetPointsSpent("WARRIOR_COMBAT");
}
// Save/load
var snapshot = tracker.CreateSnapshot();
string json = JsonUtility.ToJson(snapshot);
// ... later ...
tracker.RestoreFromSnapshot(JsonUtility.FromJson<SimpleSkillTreeTrackerSnapshot>(json));
SimpleSkillBarManager
Manages skill set loadouts at runtime. Handles equipping/unequipping skills to set slots,
tracks active set bonuses based on equipped count thresholds, and supports snapshot serialization.
Constructor
var manager = new SimpleSkillBarManager(setDatabase);
Events
| Event | Signature | Description |
OnSkillEquipped | Action<string, int, string> | Fired when a skill is equipped (setCode, slotIndex, skillCode) |
OnSkillUnequipped | Action<string, int, string> | Fired when a skill is unequipped (setCode, slotIndex, previousSkillCode) |
OnSetBonusActivated | Action<string, int> | Fired when a set bonus activates (setCode, bonusIndex) |
OnSetBonusDeactivated | Action<string, int> | Fired when a set bonus deactivates (setCode, bonusIndex) |
OnLoadoutChanged | Action<string> | Fired on any equip/unequip (setCode) |
Properties
| Property | Type | Description |
Database | ISimpleSkillSetDataSource | The set database this manager uses |
InitializedSetCodes | string[] | All initialized set codes |
Lifecycle Methods
| Method | Returns | Description |
InitializeSet(string setCode) | bool | Initialize a set for loadout tracking. Required before equip/query operations. |
IsSetInitialized(string setCode) | bool | Check if a set has been initialized |
GetLoadoutState(string setCode) | SimpleSkillSetLoadoutState | Get the runtime loadout state, or null |
Equip / Unequip Methods
| Method | Returns | Description |
EquipSkill(string setCode, int slotIndex, string skillCode) | bool | Equip a skill to a slot (auto-unequips previous) |
UnequipSkill(string setCode, int slotIndex) | bool | Unequip a skill from a slot |
ClearLoadout(string setCode) | int | Clear all equipped skills. Returns number of slots cleared. |
Query Methods
| Method | Returns | Description |
GetEquippedSkill(string setCode, int slotIndex) | string | Get the skill code in a slot, or empty string |
GetEquippedCount(string setCode) | int | Number of non-empty slots |
AreRequiredSlotsFilled(string setCode) | bool | Check if all required slots are filled |
GetActiveBonuses(string setCode) | SimpleSkillSetBonus[] | Get currently active bonuses |
IsBonusActive(string setCode, int bonusIndex) | bool | Check if a specific bonus is active |
IsSkillEquipped(string skillCode) | bool | Check if a skill is equipped in any set |
GetAllEquippedSkillCodes() | string[] | All equipped skill codes across all sets |
FindEquippedSkill(string skillCode, out string setCode, out int slotIndex) | bool | Find which set and slot a skill is equipped in |
Serialization
| Method | Returns | Description |
CreateSnapshot() | SimpleSkillBarSnapshot | Export current state as a serializable snapshot |
RestoreFromSnapshot(SimpleSkillBarSnapshot) | void | Restore state from a snapshot |
ClearAll() | void | Clear all tracked state |
Usage Example
var manager = new SimpleSkillBarManager(setDatabase);
manager.InitializeSet("WARRIOR_KIT");
manager.OnSetBonusActivated += (set, idx) =>
Debug.Log($"Bonus {idx} activated on {set}!");
manager.EquipSkill("WARRIOR_KIT", 0, "SLASH");
manager.EquipSkill("WARRIOR_KIT", 1, "SHIELD_BASH");
manager.EquipSkill("WARRIOR_KIT", 2, "CHARGE");
// Check bonuses
var bonuses = manager.GetActiveBonuses("WARRIOR_KIT");
foreach (var b in bonuses)
Debug.Log($"Active bonus ({b.requiredCount} equipped): {b.bonusDescription}");
// Save/load
var snapshot = manager.CreateSnapshot();
string json = JsonUtility.ToJson(snapshot);
// ... later ...
manager.RestoreFromSnapshot(JsonUtility.FromJson<SimpleSkillBarSnapshot>(json));
SimpleSkillComboTracker
Tracks active skill combos at runtime. Feed skill usage to auto-evaluate all defined combos
simultaneously, handles timing windows, triggers threshold rewards, and supports snapshot serialization.
Constructor
var tracker = new SimpleSkillComboTracker(comboDatabase);
Events
| Event | Signature | Description |
OnComboStarted | Action<string> | Fired when a combo starts (first step matched). Parameter: comboCode. |
OnComboProgressed | Action<string, int, int> | Fired when a combo progresses (comboCode, currentStep, totalSteps) |
OnComboCompleted | Action<string> | Fired when a combo is fully completed (comboCode) |
OnComboDropped | Action<string, string> | Fired when a combo is dropped (comboCode, reason) |
OnRewardTriggered | Action<string, int> | Fired when a combo reward triggers (comboCode, rewardIndex) |
Properties
| Property | Type | Description |
Database | ISimpleSkillComboDataSource | The combo database this tracker uses |
Skill Usage
| Method | Returns | Description |
OnSkillUsed(string skillCode, float currentTime) | void | Feed a skill usage. Evaluates all combos and starts new ones. |
Query Methods
| Method | Returns | Description |
GetActiveComboStates() | SimpleActiveComboState[] | Get all active combo states |
GetActiveComboCount() | int | Number of active combos |
IsComboActive(string comboCode) | bool | Check if a specific combo is active |
GetComboProgress(string comboCode) | float | Completion progress of an active combo (0 to 1) |
Control Methods
| Method | Returns | Description |
DropCombo(string comboCode) | void | Manually drop an active combo |
DropAllCombos() | void | Drop all active combos |
Serialization
| Method | Returns | Description |
CreateSnapshot() | SimpleComboTrackerSnapshot | Export current state as a serializable snapshot |
RestoreFromSnapshot(SimpleComboTrackerSnapshot) | void | Restore state from a snapshot |
ClearAll() | void | Clear all tracked state |
Usage Example
var tracker = new SimpleSkillComboTracker(comboDatabase);
tracker.OnComboStarted += (code) =>
Debug.Log($"Combo started: {code}");
tracker.OnComboCompleted += (code) =>
Debug.Log($"Combo complete: {code}!");
tracker.OnRewardTriggered += (code, idx) =>
Debug.Log($"Reward earned in {code}!");
// Feed skill usage as the player casts skills
tracker.OnSkillUsed("SLASH", Time.time);
tracker.OnSkillUsed("UPPERCUT", Time.time + 0.5f);
tracker.OnSkillUsed("SLAM", Time.time + 1.0f);
// Check progress
foreach (var state in tracker.GetActiveComboStates())
Debug.Log($"{state.comboCode}: {state.completedStepCount}/{state.definition.StepCount}");
// Save/load
var snapshot = tracker.CreateSnapshot();
string json = JsonUtility.ToJson(snapshot);
// ... later ...
tracker.RestoreFromSnapshot(JsonUtility.FromJson<SimpleComboTrackerSnapshot>(json));
Supporting Types
These types are used internally by the static helpers and state trackers.
PrerequisiteResult
Returned by SimpleSkillHelper.EvaluatePrerequisites().
| Field | Type | Description |
prerequisite | SimpleSkillPrerequisite | The prerequisite that was evaluated |
currentValue | float | The current value from the value provider |
passed | bool | Whether the prerequisite was met |
SimpleIntArray
Wrapper for int[] to allow serialization of nested arrays. Used for multi-select category values.
| Field | Type | Description |
values | int[] | The wrapped integer array |
Snapshot Types
All snapshot types are [Serializable] classes compatible with JsonUtility.
| Type | Used By | Contains |
SimpleSkillTreeTrackerSnapshot | SimpleSkillTreeTracker | List of tree state snapshots (treeCode, totalPointsSpent, unlockedNodeIds) |
SimpleSkillBarSnapshot | SimpleSkillBarManager | List of loadout snapshots (setCode, equippedSkills) |
SimpleComboTrackerSnapshot | SimpleSkillComboTracker | List of active combo snapshots (comboCode, completedStepCount, usedSkillCodes, lastStepTime) |