Scaling Forge
Scaling Forge creates profiles that define how enemy numeric properties (HP, ATK, DEF, Speed, etc.) change as a function of level or difficulty. Instead of manually entering stat values for every level, you define a formula and let the math do the work.
Each scaling profile contains rules — one per numeric property you want to scale. A profile is typically paired with an enemy code (e.g., the "GOBLIN_WARRIOR" profile scales HP, ATK, and DEF for goblins), but you can also create shared profiles like "DEFAULT_SCALING" that apply to many enemies.
Open the wizard via Window › Simple Enemy Forge › Scaling Forge Wizard.
Scaling Forge has 3 steps: Setup, Scaling Rules, Generate. There is no Definitions step — Scaling Forge reads its numeric property names directly from the linked Enemy Database.
The 6 Scaling Types
Each scaling rule specifies one of six types that determines how the base value transforms with level:
| Type | Formula | Use Case |
|---|---|---|
| None | value = base |
No scaling — value stays constant at all levels |
| Linear | base + (level - 1) * increment |
Steady, predictable progression. Good for HP, basic stats. |
| Percentage | base * (1 + (level - 1) * percentage / 100) |
Proportional growth. Higher base values scale faster in absolute terms. |
| Exponential | base * pow(exponentialBase, level - 1) |
Rapid power growth. Use sparingly — values explode quickly. |
| Curve | base + curve.Evaluate(level / maxLevel) * multiplier |
Full control via AnimationCurve. Design any progression shape. |
| Step | Lookup table of (level, value) pairs | Manual breakpoints. At level X, value becomes Y. No interpolation. |
Formula Examples
Linear
Percentage
Exponential
Step
Step 1 — Setup
Link Enemy Database
Scaling Forge requires exactly one Enemy Database. The wizard reads the database's numeric property names (e.g., HP, ATK, DEF, Speed) and uses them as the target properties for scaling rules. If your Enemy Database has no numeric properties defined, you will need to add some in Enemy Forge first.
Output Configuration
| Field | Description | Example |
|---|---|---|
| Database Name | Display name for the generated asset | My Scaling Profiles |
| Type Prefix | Prefix for generated C# types | My |
| Namespace | C# namespace for generated code | MyGame.Data |
Step 2 — Scaling Rules
The main editing step uses a split-panel layout:
Left Panel — Profile List
- Search — Filter profiles by name or code
- Sort — Sort alphabetically by name or code
- Multi-select — Checkbox selection for bulk operations
- Pagination — Toggle between Show All and paginated view
Right Panel — Profile Editor
Select a profile from the list to edit:
Identity
Name, Code (with Auto toggle), and Description.
Rules
Each profile contains a ReorderableList of rules. Each rule targets one numeric property from the linked Enemy Database:
| Field | Description |
|---|---|
| Target Property | Dropdown of numeric property names from the enemy database (HP, ATK, DEF, etc.) |
| Scaling Type | Dropdown: None, Linear, Percentage, Exponential, Curve, Step |
The remaining fields change based on the selected scaling type:
| Scaling Type | Visible Parameters |
|---|---|
| None | (no parameters) |
| Linear | increment — value added per level |
| Percentage | percentage — percent increase per level |
| Exponential | exponentialBase — base of the exponentiation |
| Curve | curve (AnimationCurve), curveMultiplier, curveMaxLevel |
| Step | steps — ReorderableList of (level, value) pairs, sorted by level |
Formula HelpBox
Below each rule, a HelpBox displays the active equation using the rule's current parameters. This makes it easy to verify your math at a glance:
Slider Preview
At the bottom of the profile editor, an IntSlider lets you pick a preview level. A 5-column table shows the scaling results for every rule in the profile:
| Column | Description |
|---|---|
| Property | The numeric property name |
| Type | The scaling type (Linear, Exponential, etc.) |
| Base | The unscaled base value from the enemy database |
| Scaled | The computed value at the selected level |
| Change | Delta percentage from base (e.g., +150%) |
This gives you immediate visual feedback on how your scaling rules behave across the level range.
Step 3 — Generate
Same two-phase generation as all forges:
Writes C# source files, triggers
AssetDatabase.Refresh() and domain reload.
[InitializeOnLoad] handler creates the ScriptableObject from temporary JSON data.
Generated Files
| File | Description |
|---|---|
{Prefix}ScalingType.cs |
Enum with one entry per scaling profile code |
{Prefix}ScalingDatabase.cs |
ScriptableObject implementing ISimpleScalingDataSource |
Editor/{Prefix}ScalingDatabaseEditor.cs |
Custom Inspector with split panel, slider preview, nested rules with foldouts |
{Prefix}ScalingDatabase.asset |
The data asset |
Runtime Helper — SimpleScalingHelper
A static utility class that computes scaled values using the same formulas as the generated
databases. Use this when you need to scale values outside of the database's
GetScaledValue method.
ComputeScaledValue
ScaleAllNumerics
ScaleEnemy
Using the Generated Database Directly
Runtime Data Structures
SimpleScalingStep
SimpleScalingRule
SimpleScalingProfile
Interface Reference — ISimpleScalingDataSource
| Member | Returns | Description |
|---|---|---|
ProfileCount |
int |
Total number of scaling profiles |
GetScalingProfiles() |
SimpleScalingProfile[] |
Get all scaling profiles |
GetScalingProfile(string code) |
SimpleScalingProfile? |
Get a profile by code, or null if not found |
GetProfileCodes() |
string[] |
Get all profile codes |
GetNumericNames() |
string[] |
Get numeric property names (copied from enemy DB at generation time) |
GetScaledValue(string profileCode, int numericIndex, float baseValue, int level) |
float |
Compute the scaled value for a specific profile, property, base value, and level |
Tips
Start with Linear
Linear scaling is the easiest to understand and balance. Start there for most stats (HP, ATK, DEF), then switch to other types only when you need specific curve shapes. Percentage is a natural next step for proportional growth.
Use Step for Manual Control
Step scaling gives you complete control over exact values at specific levels. It is ideal for tier-based systems (Bronze/Silver/Gold) or when designers need to hand-tune specific breakpoints rather than rely on formulas.
Preview with the Slider
Always use the slider preview to check your scaling at extreme levels. A formula that looks fine at level 10 might produce absurd values at level 50. The Change% column makes it easy to spot runaway scaling.
Test at Extremes
Check level 1 (should match base values), your expected mid-game level, and your max level. Exponential scaling in particular can produce values that break game balance if the exponentialBase is too high. A value of 1.05-1.15 is usually safe.