⚰️ Health Lifecycle¶
📦 Folder Overview¶
This folder defines lifecycle control surfaces for Health.
These APIs handle state transitions (death, revive, direct value setting) that are separate from the damage/heal pipelines.
🎯 Purpose¶
Lifecycle exists to:
- Control death and revive flows
- Allow last-chance interception before death
- Support direct state changes for setup, restore, or scripted events
Lifecycle operations are not part of the damage/heal pipelines.
🧩 What Lives Here¶
IHealthLifecycle¶
Direct lifecycle control:
Revive() / Revive(int)SetCurrent(int)
Includes IHealthReadonly.
Notes:
- Provides a surface for lifecycle transitions
- Does not guarantee rule execution, event ordering, or side effects
IBeforeDeathHandler¶
Last-chance interception before death is finalized.
- Return
true→ cancel death - Return
false→ allow death to continue
Responsibilities when cancelling:
- Restore a valid alive state (for example, health > 0)
- Ensure the object is not left in an invalid state
Receives:
IHealthLifecycle— lifecycle surfaceLastDamageReport?— may be nullbool isKillCommand— explicit kill marker
IHealthDeathHandler¶
Death side-effects hook.
Used for:
- animations
- ragdoll
- input disable
- drops / cleanup
Notes:
- Health state is already finalized when this runs
IHealthRegenerator¶
Optional seam for regeneration systems.
- Allows external systems to trigger regen cooldown
IInvincibilityHandler¶
Invincibility (i-frame) control:
- activation
- ticking
- state query
IInvincibilityTimeMode¶
Optional extension:
- Signals preference for scaled vs unscaled time
IInvincibilityResettable¶
Optional extension for invincibility implementations that support explicit clearing.
ClearInvincibility()
Purpose:
Allows systems (for example, revive flows) to clear active invincibility state.
Important:
- Not all implementations support this
- Consumers should check for this capability before calling
- Behaviour depends on implementation
Usage pattern:
if (invincibility is IInvincibilityResettable resettable)
resettable.ClearInvincibility();
⚠️ Important Notes¶
Behaviour¶
Lifecycle operations:
- Bypass damage rules
- Bypass heal rules
- Do not run pipeline evaluation
This is intentional.
Use lifecycle when you need direct state control rather than gameplay simulation.
Boundaries¶
Do not:
- Assume lifecycle calls behave like damage/heal
- Inject gameplay rules into lifecycle handlers
- Depend on internal pipeline behaviour
- Use lifecycle as a substitute for the damage system
🧠 Usage Guidance¶
- Use lifecycle for setup, restore, and explicit state transitions
- Use damage/heal pipelines for gameplay simulation
- Keep lifecycle and simulation responsibilities separate
🔗 Related Documentation¶
- Health Abstractions
- Contracts
- Rules
- Health System