Features
Power ships with a complete, production-ready toolkit for stat-driven gameplay. Everything below is built in — you configure assets in the Inspector and connect them, instead of writing and re-writing damage formulas, buff timers, immunity checks and reflection logic in every project.
This page is the full catalogue, grouped by concept. Every entry names the asset that provides it and gives a concrete example.
Not sure where to start?
Skip to the Mechanics Cookbook — a list of gameplay mechanics you can build, each mapped to the Power feature that does the work.
Stat Types
There are no predefined stats in Power. You define what a Stat means through its type and its relationships. These are the types you can build from.
Value stats
| Stat | What it stores | Example |
|---|---|---|
| Numerable (Float / Int) | Numeric values with arithmetic and comparison support | Attack, Gold, Level |
| Clamped | A numeric value locked between a min and max border | Health: 0–100 |
| Edge Value | Returns the lowest or highest candidate among the raw value and every Modifier, instead of summing them | A MoveSpeedSlow stat where only the strongest slow applies |
| Vector | Vector2, Vector3, Vector2Int, Vector3Int | Positions, directions, knockback vectors |
| String | Text values | Names, dialogue keys, localization ids |
| Actor | A reference to another Actor | "the enemy I'm currently hooked to" |
| Effect Pack | One or more Effect Packs stored as stat data | A reusable "on death" payload other systems can read |
Clamped stats: Allow Exceed
A detail that matters. Give Health a max of 100 and apply a +30 Modifier:
- Allow Exceed = true → Raw Value becomes
130, Value shows100. Take 25 damage and the raw drops to105— the visible Health doesn't move. Wrong for consumables. - Allow Exceed = false → the Modifier is trimmed on the way in, so the same 25 damage correctly leaves you at
75.
Consumable stats want it off; utility stats often want it on. Both are one checkbox.
Stat borders from other stats
A Clamped Stat's min/max can be a constant or resolved from another Stat via the MinValue / MaxValue Relative Keys — so "max Health scales with Level" is a relationship, not code.
Behavioural stats
These stats do something rather than just holding a number.
| Stat | What it does | Example |
|---|---|---|
| Generator | Generates values over time by dispatching Effects | Health regen 0.5/s, mana recovery, resource production, poison damage-over-time |
| Modifier | Transforms an incoming Effect value (Flat / Rate / Multiplier) | +20% Defense |
| Conditional Modifier | A Modifier that only fires when its condition passes | "Deal 25% more damage to targets below 50% Health" |
| Duration Modifier | Changes how long a Modifier lasts | "Buffs last twice as long", "Debuffs on me are 50% shorter" |
| Limiter | Clamps an incoming Effect value by a min or max rule | "Damage can never exceed 2% of the target's Health" |
| State Based Effect | Fires an Effect automatically while a stat condition holds | "Gain 50% Defense while Health is below 50%" |
| Event Based Effect | Fires an Effect when a named event is dispatched | "Increase Morale when an enemy dies" |
| Effect Bundle | Applies its Effect Pack to its host on initialization, and removes it cleanly | Equipping a weapon injects the weapon's whole stat system into the character |
| Director | Redirects the whole Effect to other Actors before processing | Taunt, redirect incoming healing to the whole team |
| Reflector | Redirects the final value after processing | 5% life steal, thorns, splash damage to nearby enemies |
| Counter Effect | Triggers a different Effect after an incoming one was applied — or blocked | "Slow whoever attacks me", "break the shield when it blocks", chain reactions |
| Intervener Effect | Triggers a different Effect before an incoming one lands, and can block it | Parry and riposte, revive instead of dying |
| Tweener | Moves another Stat from a start to an end value over time, with easing | Dash, leap, knockback, pull toward a hooked enemy |
Generators are more than regen
Generators never touch the target Stat directly — they generate through an Effect, so the full processing funnel still applies. They support:
- Interval mode (a tick every N seconds) or continuous mode (value = amount per second)
- Turn-based generation for turn games
- Stackable on/off — combine all Modifiers into one tick, or generate each Modifier independently
- Toggleable — switch on/off from another stat's value (
On Zero/On Positive) - Toggle Off On Zero — pauses itself at
0and resumes automatically
That last set is how Stormchannel's charge meter in 3DCells builds up while the button is held.
Container stats
| Stat | What it does |
|---|---|
| Source Separated (SrcSep) | Keeps its own combined value and a private inner Stat per source Actor |
| Signature Separated (SigSep) | Holds multiple child Stats of the same role, processed in a configured order |
Source Separated example. Three enemies each poison you. The SrcSep Poison Stat stores the combined poison and three inner stats — one per attacker. Now you can remove only that attacker's poison, or reflect only their share of the damage. Without it, you'd have a single blended number and no way back.
Signature Separated example. PhysicalAttack needs two reflection mechanics at once — HealthSteal and DamageReflect. A stat can only reference one Reflector Relative Stat, and making a new Relative Key per reflector doesn't scale. A SigSep stat holds both, and the SigSep Reflect Processors run them in order.
How a Stat Value Is Built
Every Stat resolves through a defined pipeline, so you always know where a number came from.
Default Value → Raw Value (+ Modifiers) → Modified Value (+ Injectors) → Value
- Modifiers are temporary contributions — they expire, or you remove them.
- Injectors transform the value every update — add, multiply, clamp, or override it.
Full breakdown in How Stat Values Are Evaluated.
Effect Features
An Effect is the data describing a change. Here is what you can configure without writing any code.
Health
PhysicalAttack-50Lifetime and timing
| Feature | Description | Example |
|---|---|---|
| Apply Type: Permanent | Applies the change permanently | Spend 10 Gold |
| Apply Type: Temporary | Creates a Modifier that can expire | Gain 50 Shield |
| Modifier Type: With Duration | Removed automatically when the timer or turn count runs out | +20% Attack for 10 seconds |
| Modifier Type: Managed By Code | Stays until your code removes it | An aura that lasts while you stand in a zone |
| Delay | Apply the Effect after a wait | "Deal −40 damage after 3 seconds" |
| Duration | How long the Modifier lives | 10s |
| Turn | Turn-count lifetime instead of seconds | "Lasts 3 turns" |
| Updater | Which Updater drives the Modifier's lifetime | Real-time clock vs. turn clock |
Every one of Delay, Duration and Turn can come from a Stat instead of a constant. So "cooldown scales with the caster's Haste" is configuration, not a special case.
Value calculation
| Feature | Description |
|---|---|
| Value | A fixed value |
| Use Stat Value | Pull the value from a Stat instead — this is how one shared "deal damage" Effect serves every weapon and card in a game |
| Use Value Adapter | Transform the value before processing, including converting between stat types |
Usage Types — percentage-based effects
For a target Stat with Value 15, Min 10, Max 30, and an Effect value of 0.2:
| Usage Type | Result | Reads as |
|---|---|---|
| Constant | 15 + 0.2 | Flat amount |
| Percentage Of Value | 15 + (15 × 0.2) | "Deal 20% of current Health" |
| Percentage Of Range | 15 + ((30 − 10) × 0.2) | "Heal 20% of Max Health" |
| Percentage Of Missing | 15 + ((30 − 15) × 0.2) | "Heal 20% of missing Health" — execute and recovery mechanics |
| Percentage Of Remain | 15 + ((15 − 10) × 0.2) | "Deal 20% of remaining Health" |
Use Seperate Percentage Source Stat lets the percentage be calculated from a different Stat than the one being modified — "deal damage equal to 5% of the target's Max Health, applied to their Shield".
Targeting
| Feature | Description | Example |
|---|---|---|
| Single Stat | Targets one Stat by key | Health |
| Tagged Stats | Targets every Stat matching a tag, container and environment filter | "Reduce all elemental defences by 50%", "Strip every stat tagged Debuff" |
| Effect Attributes | Flags carried by the Effect that Processors key off of | Only Effects marked Critable can crit |
| Custom Targeters, Custom Actors, Targeting Filters | Reusable targeting assets: filtered relation scopes, the closest foe in sight, static Actors, random picks | "Bounce to a random enemy within 6 m" |
Specialized Effects
| Effect | What it does | Example |
|---|---|---|
| Injector | Attaches a value transformation to a Stat | Add a permanent "×2 damage" transform while a Power card is active |
| Linker | Links one Stat's value into another and keeps it in sync | "Every 100 Dexterity increases Move Speed by 20%" |
| Modifier Remover | Removes existing Modifiers, filtered by who applied them | Cleanse — remove only debuffs applied by enemies |
| Injector Remover | Removes Injectors by tag and source Actor | End an aura when the caster dies |
| Effect Timer Modifier | Changes the remaining time on active Modifiers | "Killing an enemy reduces your cooldowns by 0.2 seconds" |
| Effect Pack | Bundles several Effects so they travel and apply together | One "hit" pack = damage + stun + VFX trigger |
| Tween | Restarts a Tweener in one Effect: endpoints, duration, progress and toggle | "Dash 4 m forward over 0.2 s" |
| Conditional | Applies a Then or an Else pack depending on stat checks — control flow without a script | "Dash to the closest foe in sight, otherwise stay" |
Removers filter by Relation, Team, a Custom Targeter, or a specific Actor Stat — so "dispel only what my ally cast on me" is a filter setting.
The Processing Funnel
An Effect never touches a Stat directly. It travels through a configurable funnel where Processors can inspect, modify, block or react to it. See Effect Process Flow.
Effect (BS / AS / MAS) → PreProcess → Process → PostProcess → DurationProcess → FeedbackProcess → Stat
Pre-process — should this Effect happen at all?
| Processor | What it does | Example |
|---|---|---|
| Immune | Blocks the Effect entirely | "Immune to stun", "immune to Physical attacks" |
| Cast Restrictor | Stops the source from applying it | "Silenced — cannot cast magic damage" |
| Hit Rate | Rolls accuracy vs. dodge and can miss | 80% Hit Rate |
| Modifier Count Limit | Caps how many Modifiers can stack | "An enemy can't have more than one Poison" — and it can count per source |
| Director | Forwards the whole Effect elsewhere | Taunt, guard, redirect healing to the team |
| Intervener Effect | Fires a different Effect before this one lands, and can block it | Retaliate on being hit, parry |
| Attribute Stat Eliminator | Removes selected Attribute Stats from processing without blocking the Effect | "Ignore the Fire part of this attack, keep the Physical part" |
| Effect Attribute Eliminator | Strips Effect Attributes to disable specific mechanics | "Orc attacks cannot critically hit" — remove Critable |
Contribution — what is the value?
Standard Processors build Contribution Data from three contribution types: Flat (10 + 2 = 12), Rate (10 + 10% = 11) and Multiplier (10 × 1.5 = 15).
| Processor | What it does | Example |
|---|---|---|
| Modifier | Applies Modifier Stats to the value | +20% Attack |
| Conditional Modifier | Applies Modifiers only when conditions pass | +50% Crit Rate against Undead |
| Critical Hit | Rolls crit rate from both sides, applies the crit multiplier, tags the Effect Critical | Crit Rate 20%, Crit Multiplier 150% |
| Multiplier Against Suppressor | Curve-based attack-vs-defence formula with tunable offset, scale and exponent | Physical Attack vs. Physical Defense |
Post-contribution — shape the final number
| Processor | What it does | Example |
|---|---|---|
| Shield | Consumes a Shield Stat before the remainder reaches the target | 10 Shield eats 10 of a 15 damage hit; 5 goes to Health |
| Limiter | Min/max clamps the value, optionally as a percentage of another stat's range, missing, or remaining portion | "Damage can never exceed 2% of the target's Health", "any hit deals at least 5" |
| Reflector | Sends a share of the final value to other Actors | Life steal, thorns, splash |
| Min Max Offset | Randomizes within a range around the base value | Weapon damage range 15–25 on a base Attack of 20 |
| Block By Result Attribute | Blocks the Effect based on what happened during processing | "Block critical hits" — after the crit roll succeeded |
Limiters can also gate on Result Attributes, so "cap only critical damage" is one setting.
Post-process — react to what happened
| Processor | What it does | Example |
|---|---|---|
| Counter Effect | Triggers an Effect after this one applied | Riposte on taking damage |
| Modifier Replacer | Replaces an existing Modifier instead of rejecting the new one | Re-applying Poison refreshes it rather than stacking |
Duration process
Duration Processors modify a Modifier's lifetime as it's added — with Flat / Rate / Multiplier contributions, stat conditions and Result Attribute checks.
A
BuffDurationModifierwith value2and Contribution Type Multiplier turns a 10-second buff into a 20-second buff.
Feedback process
Feedback Processors turn the result into presentation — floating numbers, VFX, SFX, camera shake, hit reactions, combat log. They can select feedback from the Target Stat and the Result Attributes together, so a critical Health hit and an ordinary Mana drain produce different feedback with no branching in your code.
Power Core ships no built-in Feedback Processors on purpose — presentation differs per project. Working implementations are in the Samples package.
Signed processors
Regular Processors don't care about the sign of the value. Signed variants define separate Relative Keys for positive and negative values — so a stat can be immune to damage but still healable, or reflect damage without reflecting heals.
Result Attributes
Processors tag an Effect as it flows — Critical, Reflected, and your own. Later stages read those tags. This is what makes "block crits", "cap only critical damage", and "double buff duration on critical effects" configurations rather than code branches.
The Relationship System
This is the idea the whole framework rests on: a Stat doesn't contain its rules, it points at the stats that hold them.
Health doesn't know what immunity is. It has a NegativeImmune Relative Key pointing at ImmuneToNegativeHealthEffects. The Immune Processor follows the relationship and decides. Add a new rule by adding a relationship — never by editing Health.
| Feature | Description |
|---|---|
| Relative Stat Keys | Named relationships the funnel resolves during processing |
| Target Stat vs Attribute Stat separation | The same Stat can behave differently depending on the role it plays in an Effect |
| Source / Target resolution | Every relationship is resolved separately for the attacker and the defender, and combined |
Why the role separation matters. Attack used as a Target Stat ("+5 Attack buff") resolves Modifier_Applying → AttackModifier. The same Attack used as an Attribute Stat ("deal damage using Attack") resolves Modifier_ApplyingAS → AttackDamageModifier. Two different modifiers, two different intents, one stat — with no chance of an Attack buff accidentally inflating outgoing damage.
Data Organization
| Asset | Role |
|---|---|
| Stat Repository | The full stat set an Actor uses at runtime |
| Environment | Groups Containers — one Actor can have several |
| Container | Groups Stat Definitions of the same type |
| Stat Key | Layered addressing for any Stat |
| SigSep Stat Key | Addresses a Stat inside a Signature Separated Stat |
| Tags | Let one Effect target many Stats at once |
Multiple Environments in practice. A robot with independently damageable limbs: give each limb its own Environment with its own Health, damage multipliers and reactions. Shoot the arm to zero and disable just that limb — no bespoke limb system required.
Reusable authoring packs
| Asset | What it saves you |
|---|---|
| Premade Relation Pack | Define a common relation setup once, reuse it across stats and projects |
| Premade Asset Pack | Same idea for frequently created assets without relations |
Injectors and Linkers
Modifiers expire. Injectors are persistent transformations applied on every stat update, in a configurable Injection Order.
Injector Models — inject a fixed value
| Model | Behaviour |
|---|---|
| Absolute Value | Overrides the stat with a fixed value |
| Combine | Modifies by Flat / Rate / Multiplier |
| Limit | Clamps the stat value |
| Alter Modifiers | Rewrites the Modifier values applied to the stat — "reduce all debuff values by 50%" |
Linker Models — inject another Stat's value
| Model | Behaviour |
|---|---|
| Combine | Combines one stat into another — Flat / Rate / Multiplier |
| Combine By Condition | Adds / rates / multiplies by a constant, but only while a condition holds (on the injector Stat or several Stats) |
| Absolute Value | Overrides the target with the source stat's value |
| Limit | Clamps using another stat as the bound |
| Eased Value | Multiplies by an eased curve of the source stat |
| Alter Modifiers | Rewrites the target's Modifier values by another stat |
| Multiplicative Reduction Transformer | Stacked reductions multiply instead of adding — they never reach 100 % |
| Add Attribute Value By Condition | Adds Effect / Result Attribute flags while a condition holds |
| Insert / Merge SigSep Stats | Compose Signature Separated stats at runtime |
| Just Notify | Only makes the target update when the source changes |
A common pattern: a Combine By Condition Linker Definition injects +1 into a skill's UseBlockers while its cooldown is above zero. That single injector is the cooldown gate.
Conditions, Scalers and Adapters
The connective tissue that keeps everything data-driven.
Stat Conditions
| Condition | Checks |
|---|---|
| Numerable Comparer | A number against a comparison rule |
| String | String equality |
| Actor Null Check | Whether a referenced Actor still exists |
| Vector Index / Magnitude | A vector component, or its length |
| Distance | Distance between two vector stats — proximity mechanics |
| Dot | Facing checks — "is the enemy looking at me?" |
| Sum / Difference | Combined or compared stat values |
| Dispatcher | Many conditions evaluated together |
| Dynamic | Both sides of the comparison read from Stats — thresholds that move at runtime |
Stat Scalers
Stat Scalers return a multiplier derived from stats — including Map Value (remap one range onto another), Distance, Dot, Map Sum Value and Map Dif Value.
Deadeye String in 3DCells uses this to scale the critical multiplier by how close the release was to the perfect window.
Value Adapters
Value and Stat Adapters convert and transform values in flight — including type conversion, so a Float stat can drive a Vector effect.
Vector operations available out of the box: Direction, Normalize, Dot, Cross, Reflect, Project On Plane, Sum, Subtract, To Uniform Vector, To Vector Index. Adapters can be chained, and a Tree Operation merges two stats — so a dash destination (Position + Direction × 4, flattened) is one adapter, with no script.
Turn-Based and Real-Time
Power treats pacing as configuration.
- Updaters drive time-dependent elements — Effects, Effectors and Stats. Which Updater an Effect uses is a field.
- Every duration has a Turn counterpart: Effects, Generators and Modifiers can all live on a turn clock.
- You can run both in the same project.
The proof ships with the plugin: 3DCells is real-time action, Slay The Sphere is a turn-based deck builder, and both are built from the same assets.
World Systems
| System | Purpose |
|---|---|
| Diplomacy | Teams and relations — every targeting and filtering option reads from it |
| Updater | Time and turn progression |
| Log | Runtime logging with category and per-object filtering |
| PowerWorld | The world Actor: global stats, static Actor lookup, the home of Diplomacy and the Updater |
| Save | Save Profiles capture static Actors' stats to JSON and restore them when the Actors spawn again |
| Actor | Runtime entity holding Stats, extendable via Extensions |
| Effector | Delivers Effect Packs to targets |
Tooling
Power is a framework you live in daily, so it ships with editor tooling that respects that.
| Tool | What it gives you |
|---|---|
| Power Editor | One window to create, organize and manage every Power asset |
| Power Flow | Runtime debugger showing an Effect's complete journey — every Processor that ran and what it produced. Plus a Trigger tab to fire Effects from the editor before any gameplay exists to fire them |
| Relations | The relation graph of one or more Stats: every Stat and Effect connected to them, before you change them |
| Search | Find Stats by name inside an Environment or Repository |
| Validator | Catch setup mistakes (missing Keys, misplaced Processors, SigSep collisions) before Play mode |
| Orphans | Find and clean up Power assets nothing references |
| Access | Pin frequently used assets and jump back through recent history |
| Log Filtering | Narrow logs to one system, or one Actor instance |
Power Flow is the answer to the usual complaint about data-driven systems. When a number comes out wrong, you don't guess — you open the flow and read exactly which Processor changed it.
Mechanics Cookbook
Every mechanic below is achievable by configuring assets. No custom code required unless noted.
Damage and defence
| Mechanic | Built from |
|---|---|
Weapon damage range 95–126 | Min Max Offset Processor |
Critical hits — 20% rate, 150% multiplier | Critical Hit Processor |
Conditional crits — +50% crit vs. Undead | Conditional Modifier + Stat Condition |
| Crit multiplier that scales with charge accuracy | Conditional Modifier + Map Value Scaler |
| Attack vs. Defense curve | Multiplier Against Suppressor |
| Shields that absorb before Health | Shield Processor |
| Damage cap — "never more than 2% of target Health" | Limiter, Percentage Of Range |
| Damage floor — "any hit deals at least 5" | Limiter, Min |
Dodge and accuracy — 80% hit rate | Hit Rate Processor |
| Block critical hits | Block By Result Attribute |
| Prevent crits from a whole enemy type | Effect Attribute Eliminator (remove Critable) |
Buffs, debuffs and status
| Mechanic | Built from |
|---|---|
+20% Defense buff | Modifier Stat, Rate contribution |
Temporary buff — 50 Shield for 10 seconds | Temporary Effect + Duration |
Delayed damage — −40 after 3 seconds | Effect Use Delay |
| Poison / regeneration ticking over time | Generator Stat |
| "Only one Poison per enemy" | Modifier Count Limit |
| "Re-applying Poison refreshes it" | Modifier Replacer |
| "Only one Poison per attacker" | Modifier Count Limit, source side |
| Remove a specific attacker's debuff | Source Separated Stat + filtered Modifier Remover |
| Cleanse all debuffs | Tagged Stats targeting + Modifier Remover |
| Buffs last twice as long | Duration Modifier, Multiplier |
| Longer duration on critical effects only | Duration Modifier + Result Attribute check |
| Aura active while standing in a zone | Managed By Code Modifier, or State Based Effect |
| "Gain 50% Defense below 50% Health" | State Based Effect |
| Stat immunity — "immune to stun" | Immune Processor |
| Immune to damage but still healable | Signed Immune Processor |
| Silence — "cannot cast magic damage" | Cast Restrictor |
Reactions and redirection
| Mechanic | Built from |
|---|---|
Life steal — 5% of damage dealt | Reflector |
| Thorns — deal damage back to attackers | Reflector or Counter Effect |
| Slow whoever attacks me | Counter Effect |
| Reflect damage to nearby enemies, weighted by distance | Reflector + Value Distributer |
| Taunt — redirect Effects to the guardian | Director |
| Redirect incoming healing to the whole team | Director + Team targeting |
| "When this enemy dies, damage every other enemy" | Counter Effect on the death condition |
| "Gain energy and draw a card on any kill" | Counter Effect linked into KillCounterEffects |
Scaling and relationships
| Mechanic | Built from |
|---|---|
| "Every 100 Dexterity increases Move Speed by 20%" | Linker + Stat Injector |
| Max Health scales with Level | Clamped Stat with a Stat Border |
| Parent stats — Debuff Immunity implies Stun Immunity | Relative Stat Keys |
Cooldown reduction on kill — −0.2s | Effect Timer Modifier |
| Cooldowns that gate ability use | Stat Injector into UseBlockers |
| Cost that grows each time you take damage | Counter Effect + Linker into the cost stat |
| Cost that drops per card discarded this turn | Linker from a per-turn counter |
Attributes and typing
| Mechanic | Built from |
|---|---|
| Physical / Magical, Fire / Water / Electric, Orc / Human | Attribute Stats |
| One attack that is Magic and Lightning and Orb at once | Multi Attribute Stat Effect |
| "Immune to Physical, but Fire still lands" | Attribute Stat Eliminator |
| "Ignore Lightning damage effects" | Attribute Stat Eliminator |
| Reduce all elemental defences at once | Tagged Stats targeting |
Resources and movement
| Mechanic | Built from |
|---|---|
Clamped resources — Max Health: 100 | Clamped Stat |
| Ammo that refills on kill | Clamped Int Stat + Counter Effect |
| Charge meters that build while held | Generator with Toggle Stat |
| Absolute overrides — "set Defense to 50,000 for 5s" | Absolute Value Injector, temporary |
| Knockback, pulls, dashes without physics | Tweener + one Tween Effect |
| Facing-based mechanics — "crit enemies facing you" | Dot Condition |
| Proximity mechanics | Distance Condition |
See It Running
Everything on this page is demonstrated in projects that ship with Power — with full source.
- 3DCells — a real-time action demo with 15 weapons and a shield. Conditional crits, charge states, status effects, animation-driven multi-state skills, collision Effects, environmental interaction.
- Slay The Sphere — a turn-based deck builder with 20 cards, 7 relics and 3 potions, all composed from a shared library of reusable value Stats and generic Effects.
- General Expansions — collision-based Effectors and a full Skill system, source included and free to modify.
Each sample page walks through the actual assets used, so you can open the same setup in the Editor and take it apart.
Extending Power
Power is deliberately unopinionated about your game. Every system has an extension point:
- Custom Processors for rules Power doesn't ship
- Custom Feedback Processors for your presentation layer
- Custom Targeters, Value Distributers, Value Adapters, Conditions and Scalers
- Custom Actor Extensions
- Injector and Linker models of your own
- Custom Custom Actors and Targeting Filters
And Power stays in its lane — it operates within a well-defined scope and never asks you to route your whole game through it.
Ready to try it? Start with Getting Started.