Stats
Stats define base attributes and level scaling applied to a class. These values directly modify the player's core stats provided by LevelingCore.
Unlike passives, stats are numerical values stored directly on the player and are modified when:
- A class is selected
- The player levels up
- The player levels down
Stat Behavior
Stats are applied in three stages:
1. On Class Selection
When a player selects a class:
+ base
+ ((level - 1) * perLevel)
This means:
- Players receive the base stat immediately
- Players also receive retroactive scaling for their current level
2. On Level Up
Each level gained applies:
+ perLevel
3. On Level Down
Each level lost applies:
- perLevel
Stat Structure
Each stat is defined as an object inside the stats array.
{
"id": "strength",
"base": 10,
"perLevel": 1
}
Fields
ID
Type: string
The stat identifier must match a supported LevelingCore stat.
Supported stat IDs
strengthagilityperceptionvitalityintelligenceconstitution
If an invalid ID is used, the stat will fail to apply.
Base
Type: number
The base value is applied once when the class is selected.
Behavior
- Added to the player's current stat value
- Does not overwrite existing stats
- Safe to apply at any level
Example
{
"id": "strength",
"base": 10,
"perLevel": 0
}
This adds +10 strength when the class is selected.
perLevel
Type: number
The perLevel value controls how much the stat changes per level.
Behavior
- Added on level up
- Removed on level down
- Retroactively applied when selecting a class above level 1
Example
{
"id": "vitality",
"base": 10,
"perLevel": 2
}
This results in:
- +10 vitality on class select
- +2 vitality per level
Full Example
"stats": [
{
"id": "strength",
"base": 10,
"perLevel": 1
},
{
"id": "agility",
"base": 10,
"perLevel": 0
},
{
"id": "perception",
"base": 10,
"perLevel": 1
},
{
"id": "vitality",
"base": 10,
"perLevel": 2
},
{
"id": "intelligence",
"base": 10,
"perLevel": 0
},
{
"id": "constitution",
"base": 10,
"perLevel": 1
}
]
Stacking Behavior
Stats are additive and stack with:
- Existing player stats
- Ability point allocations
- Other system modifications
Example:
Base strength from class: +10
Level scaling (level 5, perLevel 1): +4
Manual points: +3
Final strength = current + 17
Current Limitations
- Only the six core stats are supported.
- Stats must match valid LevelingCore stat IDs.
- There is no built-in stat cap.
- Negative values are not recommended and may cause unintended behavior.
Recommended Authoring Rules
General Rules
- Always use valid stat IDs
- Keep base values reasonable
- Use perLevel for scaling, not base inflation
Good Example
{
"id": "vitality",
"base": 12,
"perLevel": 2
}
Avoid
{
"id": "strength",
"base": 1000,
"perLevel": 0
}
This creates poor scaling and balance issues.
Design Notes
- Stats are applied directly to stored values, not as modifiers
- This makes them compatible with:
- manual stat allocation
- other systems modifying stats
- Level scaling is handled incrementally to avoid recalculation issues
Future Expansion
This structure supports adding fields like:
{
"id": "strength",
"base": 10,
"perLevel": 1,
"cap": 100,
"scaling": "linear"
}
These are not currently implemented but can be added later without breaking compatibility.
