View Format: Multi-Page Single Page

Simple Skill Forge

Generate Complete Skill Databases, Skill Trees, Loadouts, and Combos in Minutes.

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

FieldTypeDescription
codestringUnique identifier (SCREAMING_SNAKE_CASE)
displayNamestringHuman-readable name
descriptionstringSkill description text
iconSpriteSkill icon

Skill-Level Dynamic Properties (Level 1)

FieldTypeDescription
categoryValuesint[]Category indices (one per category definition)
flagValuesbool[]Boolean flags (one per flag definition)
numericValuesfloat[]Numeric values (one per numeric definition)
textValuesstring[]Text values (one per text definition)

Nested Data

FieldTypeDescription
ranksSimpleSkillRank[]Per-rank data with Level 2 properties
prerequisitesSimpleSkillPrerequisite[]Unlock conditions
modifiersScriptableObject[]SAF modifier assets (passive effects)

Cross-Forge References: SIF (Item Forge)

FieldTypeDescription
grantedByItemCodestringItem that teaches/grants this skill (skill books, scrolls, equipment passives)
requiredEquipmentCodestringItem that must be equipped to use this skill (weapon requirements)
producesItemCodestringItem created when this skill is used (conjure food, crafting skills)
reagentCostsSimpleSkillReagentCost[]Items consumed per cast (arrows, soul shards, catalysts)

Cross-Forge References: SEF (Enemy Forge)

FieldTypeDescription
summonEnemyCodestringEnemy summoned by this skill (necromancer minions, pet classes)
learnedFromEnemyCodestringEnemy that teaches this skill (Blue Mage, monster absorption)
taughtByNPCCodestringNPC trainer that teaches this skill (class trainers, skill masters)
effectiveAgainstFactionsstring[]Factions this skill is strong against (Holy vs Undead, type advantages)
restrictedToFactionCodestringOnly characters of this faction can use this skill

Cross-Forge References: SQF (Quest Forge)

FieldTypeDescription
unlockedByQuestCodestringQuest that must be completed to learn this skill
rewardedByQuestCodesstring[]Quests that award this skill as a reward

Cross-Forge References: SAF Character Templates

FieldTypeDescription
allowedCharacterClassesstring[]Character class names this skill is restricted to. Empty = usable by all classes.

Accessor Methods

MethodReturnsDescription
GetCategoryValue(int index)intSafe category access (returns 0 if out of range)
GetFlagValue(int index)boolSafe flag access (returns false if out of range)
GetNumericValue(int index)floatSafe numeric access (returns 0f if out of range)
GetTextValue(int index)stringSafe text access (returns "" if out of range)
GetMaxRank()intReturns the maximum rank number defined for this skill
GetRank(int rankNumber)SimpleSkillRank?Returns rank data for a specific rank number, or null

Convenience Properties

PropertyTypeDescription
IsItemGrantedboolTrue if grantedByItemCode is set
HasEquipmentRequirementboolTrue if requiredEquipmentCode is set
ProducesItemboolTrue if producesItemCode is set
HasReagentCostsboolTrue if reagentCosts has entries
IsSummonSkillboolTrue if summonEnemyCode is set
IsEnemyLearnedboolTrue if learnedFromEnemyCode is set
HasTrainerboolTrue if taughtByNPCCode is set
HasFactionEffectivenessboolTrue if effectiveAgainstFactions has entries
IsFactionRestrictedboolTrue if restrictedToFactionCode is set
IsQuestUnlockedboolTrue if unlockedByQuestCode is set
IsQuestRewardedboolTrue if rewardedByQuestCodes has entries
HasClassRestrictionboolTrue if allowedCharacterClasses has entries

Query Methods

MethodReturnsDescription
IsUsableByClass(string className)boolTrue if unrestricted or className is in allowedCharacterClasses
IsEffectiveAgainst(string factionCode)boolTrue if factionCode is in effectiveAgainstFactions
IsRewardedByQuest(string questCode)boolTrue 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.

FieldTypeDescription
rankintRank number (starts at 1, not an index)
categoryValuesint[]Rank-level category indices
flagValuesbool[]Rank-level boolean flags
numericValuesfloat[]Rank-level numeric values
textValuesstring[]Rank-level text values
upgradeCostsSimpleSkillUpgradeCost[]Resources required to reach this rank
modifiersScriptableObject[]SAF modifier assets gained at this rank

Accessor Methods

MethodReturnsDescription
GetCategoryValue(int index)intSafe category access (returns 0 if out of range)
GetFlagValue(int index)boolSafe flag access (returns false if out of range)
GetNumericValue(int index)floatSafe numeric access (returns 0f if out of range)
GetTextValue(int index)stringSafe 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.

FieldTypeDescription
resourceCodestringIdentifier of the required resource
amountfloatQuantity required

SimpleSkillReagentCost

An item consumed each time the skill is used. Different from SimpleSkillUpgradeCost which is for leveling/ranking up.

FieldTypeDescription
itemCodestringItem code consumed per cast
amountintQuantity consumed per cast

SimpleSkillPrerequisite

A prerequisite condition for unlocking a skill. Evaluated as: valueProvider(targetCode) [comparison] value

FieldTypeDescription
targetCodestringCode to evaluate (skill code, attribute code, quest code, or custom)
comparisonSimpleSkillComparisonComparison operator
valuefloatThreshold value to compare against

SimpleSkillComparison (enum)

Comparison operators for prerequisite evaluation.

ValueMeaning
EqualsCurrent value equals target (using Mathf.Approximately)
NotEqualsCurrent value does not equal target
GreaterThanCurrent value is greater than target
LessThanCurrent value is less than target
GreaterOrEqualCurrent value is greater than or equal to target
LessOrEqualCurrent value is less than or equal to target

SimpleSkillTreeDefinition

A complete skill tree with identity, nodes, connections, and single-level dynamic properties.

Fields

FieldTypeDescription
codestringUnique identifier
displayNamestringHuman-readable name
descriptionstringTree description text
iconSpriteTree icon
nodesSimpleSkillTreeNode[]All nodes in this tree
connectionsSimpleSkillTreeConnection[]Directed edges between nodes
categoryValuesint[]Category indices
flagValuesbool[]Boolean flags
numericValuesfloat[]Numeric values
textValuesstring[]Text values
allowedCharacterClassesstring[]Class restrictions (empty = unrestricted)

Accessor Methods

MethodReturnsDescription
GetCategoryValue(int index)intSafe category access (returns -1 if out of range)
GetFlagValue(int index)boolSafe flag access (returns false if out of range)
GetNumericValue(int index)floatSafe numeric access (returns 0f if out of range)
GetTextValue(int index)stringSafe 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)boolCheck if any node references this skill code
IsAvailableToClass(string className)boolTrue if unrestricted or className is allowed

Convenience Properties

PropertyTypeDescription
NodeCountintNumber of nodes
ConnectionCountintNumber of connections
HasClassRestrictionboolTrue 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.

FieldTypeDescription
nodeIdintUnique identifier within this tree
skillCodestringSkill code from a linked Skill Forge database
rowintRow position in the tree grid (visual layout)
columnintColumn position in the tree grid (visual layout)
pointCostintSkill points required to unlock this node
requiredLevelintMinimum character level required
requiredPointsInTreeintMinimum total points spent in this tree to unlock
branchGroupstringSpecialization path identifier (e.g., "Fire", "Ice"). Empty = no branch.
isRequiredboolMust 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.

FieldTypeDescription
fromNodeIdintSource node ID (must be unlocked first)
toNodeIdintTarget node ID (unlockable after parent)

SimpleSkillSetDefinition

A complete skill set with identity, slots, threshold-based bonuses, and single-level dynamic properties.

Fields

FieldTypeDescription
codestringUnique identifier
displayNamestringHuman-readable name
descriptionstringSet description text
iconSpriteSet icon
slotsSimpleSkillSetSlot[]Typed skill slots
bonusesSimpleSkillSetBonus[]Threshold-based set bonuses
categoryValuesint[]Category indices
flagValuesbool[]Boolean flags
numericValuesfloat[]Numeric values
textValuesstring[]Text values
allowedCharacterClassesstring[]Class restrictions (empty = unrestricted)

Accessor Methods

MethodReturnsDescription
GetCategoryValue(int index)intSafe category access (returns -1 if out of range)
GetFlagValue(int index)boolSafe flag access
GetNumericValue(int index)floatSafe numeric access
GetTextValue(int index)stringSafe text access
GetSlotTypes()string[]Get all unique slot type labels
GetSlotsByType(string slotType)SimpleSkillSetSlot[]Get all slots of a specific type
ContainsSkill(string skillCode)boolCheck 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)boolTrue if unrestricted or className is allowed

Convenience Properties

PropertyTypeDescription
SlotCountintNumber of slots
BonusCountintNumber of bonuses
RequiredSlotCountintNumber of required slots
HasClassRestrictionboolTrue if allowedCharacterClasses has entries

SimpleSkillSetSlot

A single slot in a skill set, with a type label, skill reference, and required flag.

FieldTypeDescription
slotTypestringSlot type label (e.g., "Active1", "Passive1", "Ultimate")
skillCodestringSkill code from a linked Skill Forge database
isRequiredboolWhether 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.

FieldTypeDescription
requiredCountintNumber of equipped skills required to activate
bonusDescriptionstringHuman-readable description of the bonus effect
modifiersScriptableObject[]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

FieldTypeDescription
codestringUnique identifier
displayNamestringHuman-readable name
descriptionstringCombo description text
iconSpriteCombo icon
stepsSimpleSkillComboStep[]Ordered steps in the combo sequence
rewardsSimpleSkillComboReward[]Threshold-based rewards
categoryValuesint[]Category indices
flagValuesbool[]Boolean flags
numericValuesfloat[]Numeric values
textValuesstring[]Text values
allowedCharacterClassesstring[]Class restrictions (empty = unrestricted)

Accessor Methods

MethodReturnsDescription
GetCategoryValue(int index)intSafe category access (returns -1 if out of range)
GetFlagValue(int index)boolSafe flag access
GetNumericValue(int index)floatSafe numeric access
GetTextValue(int index)stringSafe text access
GetStepByIndex(int index)SimpleSkillComboStep?Get step by index, or null if out of range
ContainsSkill(string skillCode)boolCheck 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)boolTrue if unrestricted or className is allowed

Convenience Properties

PropertyTypeDescription
StepCountintNumber of steps
RewardCountintNumber of rewards
HasClassRestrictionboolTrue if allowedCharacterClasses has entries

SimpleSkillComboStep

A single step in a combo chain, with a primary skill, alternates, branch grouping, and timing.

FieldTypeDescription
skillCodestringPrimary skill code for this step
isRequiredboolMust this step be hit, or can it be skipped?
alternateSkillCodesstring[]Alternative skill codes that also satisfy this step
branchGroupstringSteps in the same branch group are OR alternatives
maxDelayfloatMax seconds before the combo drops (0 = no limit)
sortOrderintSort order for step sequencing

SimpleSkillComboReward

A threshold-based reward that activates when enough combo steps are completed.

FieldTypeDescription
requiredStepsintNumber of completed steps required to earn this reward
rewardDescriptionstringHuman-readable description of the reward effect
effectCodestringGame-specific effect identifier
modifiersScriptableObject[]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

MemberReturnsDescription
SkillCountintTotal 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)boolCheck if a skill exists
GetSkillEnumType()TypeThe generated enum type for skill codes

Rank Access

MethodReturnsDescription
GetRanksForSkill(string skillCode)SimpleSkillRank[]All ranks for a skill
GetMaxRank(string skillCode)intMax rank number for a skill

Skill-Level Property Definitions (Level 1)

MethodReturnsDescription
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)

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MemberReturnsDescription
TreeCountintNumber 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)boolCheck if a tree exists
GetTreeEnumType()TypeThe generated enum type for tree codes

Node and Connection Access

MethodReturnsDescription
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)

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MemberReturnsDescription
SetCountintNumber 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)boolCheck if a set exists
GetSetEnumType()TypeThe generated enum type for set codes

Slot and Bonus Access

MethodReturnsDescription
GetSlotsForSet(string setCode)SimpleSkillSetSlot[]All slots for a set
GetBonusesForSet(string setCode)SimpleSkillSetBonus[]All bonuses for a set

Property Definitions (Single-Level)

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MemberReturnsDescription
ComboCountintNumber 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)boolCheck if a combo exists
GetComboEnumType()TypeThe generated enum type for combo codes

Step and Reward Access

MethodReturnsDescription
GetStepsForCombo(string comboCode)SimpleSkillComboStep[]All steps for a combo
GetRewardsForCombo(string comboCode)SimpleSkillComboReward[]All rewards for a combo

Cross-Reference and Class Queries

MethodReturnsDescription
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)

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
CheckPrerequisite(SimpleSkillPrerequisite, Func<string, float>)boolEvaluate a single prerequisite condition
CheckAllPrerequisites(SimpleSkillDefinition, Func<string, float>)boolEvaluate 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

MethodReturnsDescription
GetTotalUpgradeCost(SimpleSkillDefinition, string resourceCode, int fromRank, int toRank)floatTotal 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>)boolCheck if player can afford upgrading to the next rank

Cross-Reference Queries

MethodReturnsDescription
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)

MethodReturnsDescription
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)

MethodReturnsDescription
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)

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
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

MethodReturnsDescription
EvaluateCombo(SimpleSkillComboDefinition, string[] usedSkillCodes)ComboEvalResultEvaluate 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)boolCheck if a combo is fully complete
GetComboProgress(SimpleSkillComboDefinition, string[] usedSkillCodes)floatGet completion progress (0 to 1)

Result Types

ComboEvalResult

FieldTypeDescription
matchedStepCountintNumber of steps matched
totalStepCountintTotal steps in the combo
completionPercentagefloatCompletion percentage (0 to 1)
isCompleteboolWhether all steps have been matched
nextValidSkillCodesstring[]Skills that would advance the combo

ComboMatch

FieldTypeDescription
comboCodestringThe combo code
matchedStepsintNumber of steps matched
totalStepsintTotal steps in the combo
isCompleteboolWhether 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

EventSignatureDescription
OnNodeUnlockedAction<string, int>Fired when a node is unlocked (treeCode, nodeId)
OnNodeResetAction<string, int>Fired when a node is reset/locked (treeCode, nodeId)
OnTreeResetAction<string>Fired when an entire tree is reset (treeCode)
OnPointsChangedAction<string, int>Fired when points spent changes (treeCode, newTotal)

Properties

PropertyTypeDescription
DatabaseISimpleSkillTreeDataSourceThe tree database this tracker uses
InitializedTreeCodesstring[]All initialized tree codes

Lifecycle Methods

MethodReturnsDescription
InitializeTree(string treeCode)boolInitialize a tree for tracking. Required before unlock/query operations.
IsTreeInitialized(string treeCode)boolCheck if a tree has been initialized
GetTreeState(string treeCode)SimpleSkillTreeStateGet the runtime state object, or null

Node Unlock Methods

MethodReturnsDescription
CanUnlockNode(string treeCode, int nodeId, int playerLevel, int availablePoints)boolCheck all prerequisites: parent nodes, level, points in tree, point cost
UnlockNode(string treeCode, int nodeId, int playerLevel)boolUnlock a node (caller manages point deduction)
IsNodeUnlocked(string treeCode, int nodeId)boolCheck if a specific node is unlocked

Query Methods

MethodReturnsDescription
GetPointsSpent(string treeCode)intTotal skill points spent in a tree
GetPointsSpentInBranch(string treeCode, string branchGroup)intPoints 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)boolCheck if a skill code is unlocked in any tree

Reset Methods

MethodReturnsDescription
ResetNode(string treeCode, int nodeId)intReset a node and cascade to dependents. Returns points refunded.
ResetTree(string treeCode)intReset an entire tree. Returns points refunded.
ClearAll()voidClear all tracked state

Serialization

MethodReturnsDescription
CreateSnapshot()SimpleSkillTreeTrackerSnapshotExport current state as a serializable snapshot
RestoreFromSnapshot(SimpleSkillTreeTrackerSnapshot)voidRestore 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

EventSignatureDescription
OnSkillEquippedAction<string, int, string>Fired when a skill is equipped (setCode, slotIndex, skillCode)
OnSkillUnequippedAction<string, int, string>Fired when a skill is unequipped (setCode, slotIndex, previousSkillCode)
OnSetBonusActivatedAction<string, int>Fired when a set bonus activates (setCode, bonusIndex)
OnSetBonusDeactivatedAction<string, int>Fired when a set bonus deactivates (setCode, bonusIndex)
OnLoadoutChangedAction<string>Fired on any equip/unequip (setCode)

Properties

PropertyTypeDescription
DatabaseISimpleSkillSetDataSourceThe set database this manager uses
InitializedSetCodesstring[]All initialized set codes

Lifecycle Methods

MethodReturnsDescription
InitializeSet(string setCode)boolInitialize a set for loadout tracking. Required before equip/query operations.
IsSetInitialized(string setCode)boolCheck if a set has been initialized
GetLoadoutState(string setCode)SimpleSkillSetLoadoutStateGet the runtime loadout state, or null

Equip / Unequip Methods

MethodReturnsDescription
EquipSkill(string setCode, int slotIndex, string skillCode)boolEquip a skill to a slot (auto-unequips previous)
UnequipSkill(string setCode, int slotIndex)boolUnequip a skill from a slot
ClearLoadout(string setCode)intClear all equipped skills. Returns number of slots cleared.

Query Methods

MethodReturnsDescription
GetEquippedSkill(string setCode, int slotIndex)stringGet the skill code in a slot, or empty string
GetEquippedCount(string setCode)intNumber of non-empty slots
AreRequiredSlotsFilled(string setCode)boolCheck if all required slots are filled
GetActiveBonuses(string setCode)SimpleSkillSetBonus[]Get currently active bonuses
IsBonusActive(string setCode, int bonusIndex)boolCheck if a specific bonus is active
IsSkillEquipped(string skillCode)boolCheck 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)boolFind which set and slot a skill is equipped in

Serialization

MethodReturnsDescription
CreateSnapshot()SimpleSkillBarSnapshotExport current state as a serializable snapshot
RestoreFromSnapshot(SimpleSkillBarSnapshot)voidRestore state from a snapshot
ClearAll()voidClear 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

EventSignatureDescription
OnComboStartedAction<string>Fired when a combo starts (first step matched). Parameter: comboCode.
OnComboProgressedAction<string, int, int>Fired when a combo progresses (comboCode, currentStep, totalSteps)
OnComboCompletedAction<string>Fired when a combo is fully completed (comboCode)
OnComboDroppedAction<string, string>Fired when a combo is dropped (comboCode, reason)
OnRewardTriggeredAction<string, int>Fired when a combo reward triggers (comboCode, rewardIndex)

Properties

PropertyTypeDescription
DatabaseISimpleSkillComboDataSourceThe combo database this tracker uses

Skill Usage

MethodReturnsDescription
OnSkillUsed(string skillCode, float currentTime)voidFeed a skill usage. Evaluates all combos and starts new ones.

Query Methods

MethodReturnsDescription
GetActiveComboStates()SimpleActiveComboState[]Get all active combo states
GetActiveComboCount()intNumber of active combos
IsComboActive(string comboCode)boolCheck if a specific combo is active
GetComboProgress(string comboCode)floatCompletion progress of an active combo (0 to 1)

Control Methods

MethodReturnsDescription
DropCombo(string comboCode)voidManually drop an active combo
DropAllCombos()voidDrop all active combos

Serialization

MethodReturnsDescription
CreateSnapshot()SimpleComboTrackerSnapshotExport current state as a serializable snapshot
RestoreFromSnapshot(SimpleComboTrackerSnapshot)voidRestore state from a snapshot
ClearAll()voidClear 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().

FieldTypeDescription
prerequisiteSimpleSkillPrerequisiteThe prerequisite that was evaluated
currentValuefloatThe current value from the value provider
passedboolWhether the prerequisite was met

SimpleIntArray

Wrapper for int[] to allow serialization of nested arrays. Used for multi-select category values.

FieldTypeDescription
valuesint[]The wrapped integer array

Snapshot Types

All snapshot types are [Serializable] classes compatible with JsonUtility.

TypeUsed ByContains
SimpleSkillTreeTrackerSnapshotSimpleSkillTreeTrackerList of tree state snapshots (treeCode, totalPointsSpent, unlockedNodeIds)
SimpleSkillBarSnapshotSimpleSkillBarManagerList of loadout snapshots (setCode, equippedSkills)
SimpleComboTrackerSnapshotSimpleSkillComboTrackerList of active combo snapshots (comboCode, completedStepCount, usedSkillCodes, lastStepTime)