View Format: Multi-Page Single Page

Simple Enemy Forge

Generate Complete Enemy Databases, Squads, Spawn Tables, and More in Minutes.

Overview

All runtime types live in the SimpleEnemyForge namespace. Each forge wizard generates a database ScriptableObject that implements a corresponding interface. You can access data either by casting directly to the generated type, or by using the interface for generic code.

Convention: {Prefix} refers to the Class Prefix you set in each wizard's Step 1 (Setup). The Enemy Forge uses the prefix alone (e.g., MyEnemyDatabase). Other forges append a suffix: {Prefix}SquadDatabase, {Prefix}SpawnDatabase, {Prefix}ScalingDatabase, {Prefix}WaveDatabase, {Prefix}BehaviorDatabase, {Prefix}FactionDatabase.

Two access patterns are available for all databases:

// Pattern 1: Direct cast (type-safe, requires knowing generated class name) var db = enemyDatabaseAsset as MyEnemyDatabase; var goblin = db.GetEnemyByCode("GOBLIN_WARRIOR"); // Pattern 2: Interface cast (generic, works with any enemy database) var source = enemyDatabaseAsset as ISimpleEnemyDataSource; var goblin = source.GetEnemyByCode("GOBLIN_WARRIOR");

Enemy Database

SimpleEnemyDefinition Struct

Defines a single enemy with all its properties. Uses dynamic property arrays that correspond to the property definitions stored in the database.

FieldTypeDescription
namestringDisplay name shown to players (e.g., "Goblin Warrior")
codestringUnique UPPER_SNAKE_CASE identifier (e.g., "GOBLIN_WARRIOR")
descriptionstringEnemy description/lore text
iconSpriteEnemy portrait/sprite icon
categoryValuesint[]Category selections (index into each category's entries). For multi-select categories, this holds -1 as a placeholder.
categoryMultiValuesSimpleIntArray[]Multi-select category values. For single-select categories, the inner array is empty.
flagValuesbool[]Boolean flag values aligned with database flag definitions
numericValuesfloat[]Numeric property values. For range properties, this is the min value.
numericRangeMaxValuesfloat[]Max values for range numeric properties. For non-range properties, ignored (0).
textValuesstring[]Text property values aligned with database text definitions
modifiersScriptableObject[]SAF modifier references (empty if SAF not installed)
lootTableCodestringSIF loot table code (empty if SIF not installed)
lootTableScriptableObjectSIF loot table reference (null if SIF not installed)

Convenience Accessors

SimpleEnemyDefinition provides safe accessor methods that return defaults for out-of-range indices:

MethodReturnsDescription
GetCategoryValue(int categoryIndex)intSelected entry index for a single-select category (default: 0)
GetCategoryMultiValues(int categoryIndex)int[]Selected entry indices for a multi-select category
GetFlagValue(int flagIndex)boolFlag value (default: false)
GetNumericValue(int numericIndex)floatNumeric value (default: 0f)
GetNumericRange(int numericIndex)(float min, float max)Range numeric min/max values
GetTextValue(int textIndex)stringText value (default: "")

ISimpleEnemyDataSource Interface

Enemy Access

Method / PropertyReturnsDescription
EnemyCountintTotal number of enemies in database
GetEnemyDefinitions()SimpleEnemyDefinition[]Get all enemy definitions
GetEnemyNames()string[]Get all enemy display names
GetEnemyCodes()string[]Get all enemy codes
GetEnemyByName(string name)SimpleEnemyDefinition?Get enemy by display name, or null
GetEnemyByCode(string code)SimpleEnemyDefinition?Get enemy by code, or null
HasEnemy(string nameOrCode)boolCheck if enemy exists by name or code
GetEnemyEnumType()TypeGet the generated enum type for type-safe access

Property Definitions

MethodReturnsDescription
GetCategoryLabels()string[]Category labels (e.g., "Enemy Type", "Rank")
GetCategoryEntries(int categoryIndex)string[]Entries for a specific category
GetFlagNames()string[]Flag names (e.g., "Is Boss", "Is Flying")
GetNumericNames()string[]Numeric property names (e.g., "HP", "Attack Power")
GetTextNames()string[]Text property names (e.g., "Lore", "Weakness Hints")

Dynamic Filtering

MethodReturnsDescription
GetEnemiesByCategory(int categoryIndex, int entryIndex)SimpleEnemyDefinition[]All enemies with specified category value
GetEnemiesByFlag(int flagIndex, bool value)SimpleEnemyDefinition[]All enemies with specified flag value
GetEnemiesByNumericRange(int numericIndex, float min, float max)SimpleEnemyDefinition[]All enemies with numeric in range

Code Example

using SimpleEnemyForge; // Get database via interface var db = myDatabaseAsset as ISimpleEnemyDataSource; // Look up an enemy var enemy = db.GetEnemyByCode("SHADOW_WRAITH"); if (enemy.HasValue) { Debug.Log($"Name: {enemy.Value.name}"); Debug.Log($"HP: {enemy.Value.GetNumericValue(0)}"); Debug.Log($"Is Boss: {enemy.Value.GetFlagValue(0)}"); } // Filter enemies by category var bosses = db.GetEnemiesByFlag(0, true); // flag 0 = "Is Boss" var undead = db.GetEnemiesByCategory(0, 2); // category 0 entry 2 = "Undead"

Squad Database

SimpleSquadSlot Struct

FieldTypeDescription
enemyCodestringEnemy code referencing the enemy database
countMinintMinimum spawn count for this slot
countMaxintMaximum spawn count (same as min for fixed count)
levelintLevel override (-1 = use enemy default)

SimpleSquadGroup Struct

FieldTypeDescription
codestringUnique code identifier (e.g., "GOBLIN_PATROL")
namestringDisplay name (e.g., "Goblin Patrol")
descriptionstringDescription of this squad
slotsSimpleSquadSlot[]Enemy slots in this squad
categoryValuesint[]Category values (aligned with database definitions)
flagValuesbool[]Flag values (aligned with database definitions)
numericValuesfloat[]Numeric values (aligned with database definitions)
textValuesstring[]Text values (aligned with database definitions)

ISimpleSquadDataSource Interface

Method / PropertyReturnsDescription
SquadCountintTotal number of squads in database
GetAllSquads()SimpleSquadGroup[]Get all squad groups
GetSquadByCode(string code)SimpleSquadGroup?Get squad by code, or null
GetSquadsContainingEnemy(string enemyCode)SimpleSquadGroup[]All squads containing a specific enemy
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

Code Example

var squadDb = mySquadAsset as ISimpleSquadDataSource; var patrol = squadDb.GetSquadByCode("GOBLIN_PATROL"); if (patrol.HasValue) { foreach (var slot in patrol.Value.slots) { int count = Random.Range(slot.countMin, slot.countMax + 1); Debug.Log($"Spawn {count}x {slot.enemyCode}"); } }

Spawn Database

Data Hierarchy

Spawn tables use a 4-level hierarchy: Table › Pool › Entry › Condition.

SimpleSpawnTable Struct

FieldTypeDescription
codestringUnique code identifier (e.g., "FOREST_SPAWNS")
namestringDisplay name
descriptionstringDescription of this spawn table
poolsSimpleSpawnPool[]Pools in this spawn table

SimpleSpawnPool Struct

FieldTypeDescription
namestringDisplay name (e.g., "Main Wave", "Reinforcements")
rollCountMinintMinimum number of rolls from this pool
rollCountMaxintMaximum number of rolls from this pool
rollChancefloatChance (0-100) that this pool activates
conditionsSimpleSpawnCondition[]Conditions that must be met for this pool to activate
entriesSimpleSpawnEntry[]Entries in this pool

SimpleSpawnEntry Struct

FieldTypeDescription
squadCodestringSquad code (empty if single enemy)
singleEnemyCodestringEnemy code (empty if squad)
weightfloatBase weight for selection (higher = more likely)
conditionsSimpleSpawnCondition[]Conditions for this entry to be included
weightModifiersSimpleSpawnWeightModifier[]Modifiers that adjust weight based on context
IsSquadboolTrue if this entry references a squad group

SimpleSpawnCondition Struct

FieldTypeDescription
logicSimpleSpawnConditionLogicLogic operator for chaining (None for first condition)
sourceTypeSimpleSpawnConditionSourceTypeWhat type of definition to check (Category, Flag, Numeric)
sourceIndexintIndex into the relevant definition array
comparisonSimpleSpawnConditionComparisonHow to compare the value
valuefloatValue to compare against

Condition Enums

EnumValues
SimpleSpawnConditionSourceTypeCategory, Flag, Numeric
SimpleSpawnConditionComparisonEquals, NotEquals, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual
SimpleSpawnConditionLogicNone, And, Or, Not

SimpleSpawnWeightModifier Struct

FieldTypeDescription
numericIndexintWhich numeric definition affects weight
modifierTypeSimpleSpawnWeightModifierTypeFlatPerPoint or PercentPerPoint
valuefloatValue per point (flat or percent)

ISimpleSpawnDataSource Interface

Method / PropertyReturnsDescription
SpawnTableCountintTotal number of spawn tables
GetSpawnTables()SimpleSpawnTable[]Get all spawn tables
GetSpawnTable(string code)SimpleSpawnTable?Get spawn table by code, or null
GetSpawnTableCodes()string[]Get all spawn table codes
GetContextCategoryLabels()string[]Context category labels (e.g., "Biome", "Time of Day")
GetContextCategoryEntries(int categoryIndex)string[]Entries for a context category
GetContextFlagNames()string[]Context flag names (e.g., "Is Night", "Is Raining")
GetContextNumericNames()string[]Context numeric names (e.g., "Player Level", "Difficulty")
GetTablesContainingEnemy(string enemyCode)SimpleSpawnTable[]All tables that can spawn a specific enemy
GetTablesContainingSquad(string squadCode)SimpleSpawnTable[]All tables that reference a specific squad

Scaling Database

SimpleScalingType Enum

ValueFormula
NoneNo scaling — use base value as-is
Linearbase + (level - 1) * increment
Percentagebase * (1 + (level - 1) * percentage / 100)
Exponentialbase * pow(exponentialBase, level - 1)
Curvebase + curve.Evaluate(level / maxLevel) * curveMultiplier
StepDirect lookup table — at level X, value is Y

SimpleScalingStep Struct

FieldTypeDescription
levelintLevel at which this value takes effect
valuefloatThe value to use at this level (absolute, not additive)

SimpleScalingRule Struct

FieldTypeDescription
numericIndexintIndex into the enemy database's numeric definitions
scalingTypeSimpleScalingTypeHow this rule scales the value
incrementfloatValue added per level (Linear)
percentagefloatPercent increase per level (Percentage)
exponentialBasefloatBase of exponentiation (Exponential)
curveAnimationCurveCurve mapping normalized level to a multiplier (Curve)
curveMultiplierfloatScales the curve output (Curve)
curveMaxLevelintMaximum level for curve normalization (Curve)
stepsSimpleScalingStep[]Level-value lookup table (Step)

SimpleScalingProfile Struct

FieldTypeDescription
codestringUnique code for this profile (often matches an enemy code)
namestringDisplay name
descriptionstringOptional description
rulesSimpleScalingRule[]Scaling rules for individual numeric properties

ISimpleScalingDataSource Interface

Method / PropertyReturnsDescription
ProfileCountintTotal number of scaling profiles
GetScalingProfiles()SimpleScalingProfile[]Get all scaling profiles
GetScalingProfile(string code)SimpleScalingProfile?Get profile by code, or null
GetProfileCodes()string[]Get all profile codes
GetNumericNames()string[]Numeric property names (copied from linked enemy DB)
GetScaledValue(string profileCode, int numericIndex, float baseValue, int level)floatCompute scaled value for a specific profile, property, and level

Wave Database

Data Hierarchy

Wave data uses a 3-level hierarchy: Sequence › Wave › Entry.

SimpleWaveEntry Struct

FieldTypeDescription
enemyCodestringSingle enemy code (empty if using squad)
squadCodestringSquad code (empty if using single enemy)
countintHow many to spawn from this entry
spawnDelayfloatDelay in seconds between each individual spawn
startTimefloatTime offset from the start of the wave
IsSquadboolTrue if this entry references a squad group

SimpleWave Struct

FieldTypeDescription
namestringDisplay name (e.g., "Wave 1", "Boss Wave")
preDelayfloatDelay before this wave starts spawning
postDelayfloatDelay after this wave finishes before the next begins
entriesSimpleWaveEntry[]Entries to spawn during this wave

SimpleWaveSequence Struct

FieldTypeDescription
codestringUnique code identifier (e.g., "FOREST_WAVES")
namestringDisplay name
descriptionstringDescription of this wave sequence
wavesSimpleWave[]Ordered waves in this sequence
loopAfterLastboolWhether to loop after the last wave
difficultyScalePerLoopfloatDifficulty multiplier per loop (e.g., 1.2 = 20% harder)
maxLoopsintMaximum loop iterations (0 = infinite)
categoryValuesint[]Category values (aligned with database definitions)
flagValuesbool[]Flag values
numericValuesfloat[]Numeric values
textValuesstring[]Text values

ISimpleWaveDataSource Interface

Method / PropertyReturnsDescription
WaveSequenceCountintTotal number of wave sequences
GetWaveSequences()SimpleWaveSequence[]Get all wave sequences
GetWaveSequence(string code)SimpleWaveSequence?Get sequence by code, or null
GetWaveSequenceCodes()string[]Get all sequence codes
GetCategoryLabels()string[]Category labels for wave sequences
GetCategoryEntries(int categoryIndex)string[]Entries for a category
GetFlagNames()string[]Flag names
GetNumericNames()string[]Numeric property names
GetTextNames()string[]Text property names
GetSequencesContainingEnemy(string enemyCode)SimpleWaveSequence[]All sequences containing a specific enemy
GetSequencesContainingSquad(string squadCode)SimpleWaveSequence[]All sequences containing a specific squad

Behavior Database

SimpleBehaviorRule Struct

FieldTypeDescription
conditionsSimpleSpawnCondition[]Conditions that must be satisfied to trigger this rule (reuses spawn condition system)
actionCodestringUser-defined action code (e.g., "HEAL", "FLEE", "AOE_ATTACK")
priorityintPriority for conflict resolution — higher wins
cooldownfloatMinimum seconds between triggers of this rule

SimpleBehaviorProfile Struct

FieldTypeDescription
codestringUnique code for this profile (e.g., "AGGRESSIVE_MELEE")
namestringDisplay name
descriptionstringDescription of this profile's behavior pattern
rulesSimpleBehaviorRule[]Behavior rules evaluated in priority order
categoryValuesint[]Category values (aligned with database definitions)
flagValuesbool[]Flag values
numericValuesfloat[]Numeric values
textValuesstring[]Text values

ISimpleBehaviorDataSource Interface

Method / PropertyReturnsDescription
ProfileCountintTotal number of behavior profiles
GetBehaviorProfiles()SimpleBehaviorProfile[]Get all behavior profiles
GetBehaviorProfile(string code)SimpleBehaviorProfile?Get profile by code, or null
GetProfileCodes()string[]Get all profile codes
GetProfileNames()string[]Get all profile display names

Faction Database

SimpleFactionStance Enum

ValueIntDescription
Hostile-2Factions are openly hostile — attack on sight
Unfriendly-1Factions are unfriendly — may attack under certain conditions
Neutral0Factions are neutral — no inherent behavior
Friendly1Factions are friendly — will not attack, may cooperate
Allied2Factions are allied — fully cooperative

SimpleFactionDefinition Struct

FieldTypeDescription
codestringUnique code identifier (e.g., "UNDEAD")
namestringDisplay name (e.g., "The Undead")
descriptionstringOptional description of the faction
colorColorOptional color for editor display
categoryValuesint[]Category values
flagValuesbool[]Flag values
numericValuesfloat[]Numeric values
textValuesstring[]Text values

ISimpleFactionDataSource Interface

Faction Access

Method / PropertyReturnsDescription
FactionCountintTotal number of factions
GetFactionNames()string[]Get all faction names
GetFactionCodes()string[]Get all faction codes
GetFactionDefinitions()SimpleFactionDefinition[]Get all faction definitions

Relationship Queries

MethodReturnsDescription
GetRelationship(string codeA, string codeB)SimpleFactionStanceGet stance between two factions by code
GetRelationship(int indexA, int indexB)SimpleFactionStanceGet stance between two factions by index
IsHostile(string codeA, string codeB)boolCheck if stance is Hostile
IsAllied(string codeA, string codeB)boolCheck if stance is Allied
IsFriendly(string codeA, string codeB)boolCheck if stance is Friendly or higher
GetHostileFactions(string factionCode)string[]All factions hostile to the specified faction
GetAlliedFactions(string factionCode)string[]All factions allied with the specified faction

Metadata Access

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

Runtime Helpers

SEF includes 7 static/instance helper classes for common runtime operations. These are ready to use out of the box — no code generation needed.

1. SimpleSpawnRoller

Rolls spawn tables using weighted random selection. Evaluates pool conditions, computes effective weights with modifiers, and performs with-replacement random selection.

MethodReturnsDescription
Roll(SimpleSpawnTable table, SimpleSpawnContext context)SpawnRollResult[]Roll using Unity's Random
Roll(SimpleSpawnTable table, SimpleSpawnContext context, System.Random rng)SpawnRollResult[]Roll with a specific RNG (for deterministic results)
RollPool(SimpleSpawnPool pool, int poolIndex, SimpleSpawnContext context, System.Random rng)SpawnRollResult[]Roll a single pool

SpawnRollResult struct fields: enemyCode, squadCode, IsSquad, sourcePoolName, poolIndex, entryIndex.

var context = SimpleSpawnContext.Create(1, 1, 2) .SetCategory(0, 1) // Biome = Forest .SetFlag(0, true) // Is Night = true .SetNumeric(0, 15f) // Player Level = 15 .SetNumeric(1, 3f) // Difficulty = 3 .Build(); var results = SimpleSpawnRoller.Roll(spawnTable, context); foreach (var r in results) { if (r.IsSquad) Debug.Log($"Spawn squad: {r.squadCode} from pool '{r.sourcePoolName}'"); else Debug.Log($"Spawn enemy: {r.enemyCode} from pool '{r.sourcePoolName}'"); }

2. SimpleSpawnContext

Holds current game state values for evaluating spawn and behavior conditions. Includes a fluent builder pattern for easy construction.

MethodReturnsDescription
SimpleSpawnContext.Create(int cats, int flags, int nums)SimpleSpawnContextBuilderStart building with fluent API
builder.SetCategory(int index, int value)SimpleSpawnContextBuilderSet a category value
builder.SetFlag(int index, bool value)SimpleSpawnContextBuilderSet a flag value
builder.SetNumeric(int index, float value)SimpleSpawnContextBuilderSet a numeric value
builder.Build()SimpleSpawnContextBuild the final context

3. SimpleSpawnEvaluator

Static building blocks for spawn condition evaluation and weight computation. Used internally by SimpleSpawnRoller and available for custom spawn logic.

MethodReturnsDescription
EvaluateSingleCondition(condition, context)boolEvaluate a single condition
EvaluateConditions(conditions[], context)boolEvaluate a chain of conditions with And/Or/Not logic
ComputeEffectiveWeight(entry, context)floatCompute weight after conditions and modifiers (0 = excluded)
IsPoolActive(pool, context)boolCheck if a pool's conditions are met
GetEligibleEntries(pool, context)(int entryIndex, float weight)[]Get all entries with weight > 0

4. SimpleScalingHelper

Static utility for computing scaled values from scaling rules and profiles.

MethodReturnsDescription
ComputeScaledValue(rule, baseValue, level)floatApply a single scaling rule to a base value
ScaleAllNumerics(profile, baseValues[], level)float[]Scale an entire array of numeric values
ScaleEnemy(enemy, profile, level)float[]Scale an enemy's numeric values by profile and level
ScaleEnemy(enemy, profile, level, difficultyMultiplier)float[]Scale with additional difficulty multiplier
// Scale an enemy to level 10 var enemy = enemyDb.GetEnemyByCode("GOBLIN_WARRIOR").Value; var profile = scalingDb.GetScalingProfile("GOBLIN_WARRIOR").Value; float[] scaled = SimpleScalingHelper.ScaleEnemy(enemy, profile, 10); // With difficulty multiplier (e.g., wave loop scaling) float[] hardMode = SimpleScalingHelper.ScaleEnemy(enemy, profile, 10, 1.5f);

5. SimpleWaveRunner

Pure C# event-driven wave runner. Not a MonoBehaviour — you call Update(deltaTime) from your own game loop. Drives a state machine through PreDelay, Spawning, PostDelay phases with loop support.

Events

EventSignatureDescription
OnWaveStartedAction<int, string>Fires when a wave begins spawning (waveIndex, waveName)
OnSpawnRequestedAction<WaveSpawnRequest>Fires once per individual spawn
OnWaveCompletedAction<int, string>Fires when all entries in a wave are dispatched
OnSequenceCompletedActionFires when the entire sequence is done
OnLoopStartedAction<int, float>Fires when the sequence loops (loopCount, difficultyScale)
OnPausedActionFires when the runner is paused
OnResumedActionFires when the runner is resumed

Control Methods

MethodDescription
Start(SimpleWaveSequence sequence)Start running a wave sequence from the beginning
Update(float deltaTime)Drive the state machine forward (call each frame)
Pause()Pause the runner
Resume()Resume after pausing
Stop()Stop and reset to idle
SkipToWave(int waveIndex)Skip to a specific wave
SkipCurrentWave()Skip remaining spawns in current wave

Read-Only State

PropertyTypeDescription
PhaseWaveRunnerPhaseCurrent phase (Idle, PreDelay, Spawning, PostDelay, Complete)
CurrentWaveIndexintIndex of the current wave
LoopCountintCompleted loop iterations (0 on first play-through)
CurrentDifficultyScalefloatCumulative difficulty scale (starts at 1.0)
ElapsedTimefloatTotal elapsed time since Start (paused time excluded)
IsPausedboolTrue if paused
IsRunningboolTrue if actively running
IsCompleteboolTrue if sequence has completed
var runner = new SimpleWaveRunner(); runner.OnWaveStarted += (index, name) => Debug.Log($"Wave {index}: {name} started"); runner.OnSpawnRequested += (req) => { if (req.IsSquad) SpawnSquad(req.squadCode, req.difficultyScale); else SpawnEnemy(req.enemyCode, req.difficultyScale); }; runner.OnSequenceCompleted += () => Debug.Log("All waves complete!"); var sequence = waveDb.GetWaveSequence("FOREST_WAVES").Value; runner.Start(sequence); // In your Update loop: void Update() { runner.Update(Time.deltaTime); }

6. SimpleBehaviorEvaluator

Static methods for evaluating behavior profile rules against a spawn context. Uses the same condition system as spawn tables.

MethodReturnsDescription
EvaluateProfile(profile, context)SimpleBehaviorRule[]All matching rules, sorted by priority descending
EvaluateBestAction(profile, context)SimpleBehaviorRule?Highest-priority matching rule, or null
GetMatchingActionCodes(profile, context)string[]Action codes for all matching rules
var profile = behaviorDb.GetBehaviorProfile("AGGRESSIVE_MELEE").Value; var context = SimpleSpawnContext.Create(0, 1, 2) .SetFlag(0, true) // In Combat = true .SetNumeric(0, 0.3f) // HP Percent = 30% .SetNumeric(1, 5f) // Distance to Target = 5 .Build(); var best = SimpleBehaviorEvaluator.EvaluateBestAction(profile, context); if (best.HasValue) Debug.Log($"Best action: {best.Value.actionCode} (priority {best.Value.priority})"); // Or get all matching actions string[] actions = SimpleBehaviorEvaluator.GetMatchingActionCodes(profile, context); // e.g., ["HEAL", "FLEE", "MELEE_ATTACK"] sorted by priority

7. SimpleFactionHelper

Static convenience methods for faction relationship queries beyond what ISimpleFactionDataSource provides directly.

MethodReturnsDescription
IsHostileOrUnfriendly(db, codeA, codeB)boolTrue if stance is less than Neutral
IsFriendlyOrAllied(db, codeA, codeB)boolTrue if stance is greater than Neutral
GetStanceValue(db, codeA, codeB)intNumeric stance value (-2 to 2)
GetNonHostileFactions(db, factionCode)string[]All faction codes that are NOT hostile
GetFactionsWithStance(db, factionCode, stance)string[]All factions with the exact specified stance
var factionDb = myFactionAsset as ISimpleFactionDataSource; // Check relationships bool hostile = factionDb.IsHostile("UNDEAD", "HUMANS"); bool allied = factionDb.IsAllied("ELVES", "HUMANS"); // Get all enemies of a faction string[] enemies = factionDb.GetHostileFactions("HUMANS"); // Extended queries via helper bool threat = SimpleFactionHelper.IsHostileOrUnfriendly(factionDb, "UNDEAD", "HUMANS"); string[] nonHostile = SimpleFactionHelper.GetNonHostileFactions(factionDb, "HUMANS"); int stanceVal = SimpleFactionHelper.GetStanceValue(factionDb, "ELVES", "DWARVES"); // -2 to 2

Namespace Reference

All runtime types in the SimpleEnemyForge namespace:

SimpleEnemyForge (namespace) ├─ SimpleEnemyDefinition.cs │ ├─ SimpleIntArray (struct) │ └─ SimpleEnemyDefinition (struct) ├─ ISimpleEnemyDataSource.cs │ └─ ISimpleEnemyDataSource (interface) ├─ SimpleEnemyEnums.cs │ ├─ SimpleSpawnConditionSourceType (enum) │ ├─ SimpleSpawnConditionComparison (enum) │ ├─ SimpleSpawnConditionLogic (enum) │ └─ SimpleSpawnWeightModifierType (enum) ├─ SimpleSquadGroup.cs │ ├─ SimpleSquadSlot (struct) │ └─ SimpleSquadGroup (struct) ├─ ISimpleSquadDataSource.cs │ └─ ISimpleSquadDataSource (interface) ├─ SimpleSpawnTable.cs │ ├─ StringArray (class) │ ├─ SimpleSpawnCondition (struct) │ ├─ SimpleSpawnWeightModifier (struct) │ ├─ SimpleSpawnEntry (struct) │ ├─ SimpleSpawnPool (struct) │ └─ SimpleSpawnTable (struct) ├─ ISimpleSpawnDataSource.cs │ └─ ISimpleSpawnDataSource (interface) ├─ SimpleScalingProfile.cs │ ├─ SimpleScalingType (enum) │ ├─ SimpleScalingStep (struct) │ ├─ SimpleScalingRule (struct) │ └─ SimpleScalingProfile (struct) ├─ ISimpleScalingDataSource.cs │ └─ ISimpleScalingDataSource (interface) ├─ SimpleWaveDefinition.cs │ ├─ SimpleWaveEntry (struct) │ ├─ SimpleWave (struct) │ └─ SimpleWaveSequence (struct) ├─ ISimpleWaveDataSource.cs │ └─ ISimpleWaveDataSource (interface) ├─ SimpleBehaviorProfile.cs │ ├─ SimpleBehaviorRule (struct) │ └─ SimpleBehaviorProfile (struct) ├─ ISimpleBehaviorDataSource.cs │ └─ ISimpleBehaviorDataSource (interface) ├─ SimpleBehaviorEvaluator.cs │ └─ SimpleBehaviorEvaluator (static class) ├─ SimpleFactionData.cs │ ├─ SimpleFactionStance (enum) │ └─ SimpleFactionDefinition (struct) ├─ ISimpleFactionDataSource.cs │ └─ ISimpleFactionDataSource (interface) ├─ SimpleSpawnContext.cs │ ├─ SimpleSpawnContext (struct) │ └─ SimpleSpawnContextBuilder (struct) ├─ SimpleSpawnEvaluator.cs │ └─ SimpleSpawnEvaluator (static class) ├─ SimpleSpawnRoller.cs │ ├─ SpawnRollResult (struct) │ └─ SimpleSpawnRoller (static class) ├─ SimpleScalingHelper.cs │ └─ SimpleScalingHelper (static class) ├─ SimpleWaveRunner.cs │ ├─ WaveSpawnRequest (struct) │ ├─ WaveRunnerPhase (enum) │ └─ SimpleWaveRunner (class) ├─ SimpleFactionHelper.cs │ └─ SimpleFactionHelper (static class) └─ Demo/BestiaryDemo.cs └─ BestiaryDemo (MonoBehaviour)