t1k:cocos:playable:progression
| Field | Value |
|---|---|
| Module | playable |
| Version | 0.5.6 |
| Effort | high |
| Tools | — |
Keywords: ads, cocos, difficulty, level, playable, progression, scaler
How to invoke
Section titled “How to invoke”/t1k:cocos:playable:progressionProgressionManager & DifficultyScaler
Section titled “ProgressionManager & DifficultyScaler”Two static utility classes for level/round flow. ProgressionManager tracks the current level and fires lifecycle signals. DifficultyScaler computes parameter values that scale with level using LINEAR, EXPONENTIAL, or STEPPED curves. See also: t1k-cocos-playable-signalbus, t1k-cocos-playable-score.
Import paths:
db://assets/PLAGameFoundation/progression/ProgressionManagerdb://assets/PLAGameFoundation/progression/DifficultyScaler
ProgressionManager API (static)
Section titled “ProgressionManager API (static)”Signals
Section titled “Signals”export class LevelStartSignal { constructor(public level: number) {}}
export class LevelCompleteSignal { constructor(public level: number) {}}
export class LevelFailSignal { constructor(public level: number) {}}Properties (read-only)
Section titled “Properties (read-only)”ProgressionManager.currentLevel // current level number (starts at 1)ProgressionManager.maxLevel // maximum level cap (default 10)ProgressionManager.isLevelActive // true between startLevel and complete/failMethods
Section titled “Methods”ProgressionManager.startLevel(level?: number): void// Sets _isLevelActive = true. Optionally overrides current level. Fires LevelStartSignal.
ProgressionManager.completeLevel(): void// Sets _isLevelActive = false. Advances currentLevel (capped at maxLevel). Fires LevelCompleteSignal.
ProgressionManager.failLevel(): void// Sets _isLevelActive = false. Does NOT advance level. Fires LevelFailSignal.
ProgressionManager.reset(): void// Resets currentLevel to 1, _isLevelActive = false.
ProgressionManager.setMaxLevel(max: number): void// Override the level cap. Minimum 1.DifficultyScaler API (static)
Section titled “DifficultyScaler API (static)”ScalingCurve enum
Section titled “ScalingCurve enum”LINEAR (t = level/maxLevel), EXPONENTIAL (t = (level/maxLevel)^2, slow start then fast ramp), STEPPED (5 equal tiers). See references/scaling-formulas.md for details.
Methods
Section titled “Methods”DifficultyScaler.scale(options: { baseValue: number; // value at level 1 maxValue: number; // value at maxLevel level?: number; // defaults to ProgressionManager.currentLevel maxLevel?: number; // defaults to ProgressionManager.maxLevel curve?: ScalingCurve; // defaults to LINEAR}): number// Returns baseValue + (maxValue - baseValue) * t// Use for values that INCREASE with level: speed, spawn count, etc.
DifficultyScaler.scaleInverse(options: { baseValue: number; // value at level 1 minValue: number; // value at maxLevel level?: number; maxLevel?: number; curve?: ScalingCurve;}): number// Returns baseValue - (baseValue - minValue) * t// Use for values that DECREASE with level: timer duration, spawn interval, etc.Usage Examples
Section titled “Usage Examples”See references/scaling-formulas.md for complete usage examples and scaling formula details.
Integration Points
Section titled “Integration Points”- Both classes depend on
SignalBus.instance— ensure SignalBus is initialized before first use (it initializes ongetInstance()call, which is safe). ProgressionManager.reset()should be called alongsideScoreTracker.reset()when restarting.DifficultyScalerreadsProgressionManager.currentLevelandProgressionManager.maxLevelby default — callProgressionManager.startLevel()before usingDifficultyScalerso the level is set correctly.- Use
LevelStartSignalto re-applyDifficultyScalervalues each round (enemy speed, spawn counts, etc.).
Common Mistakes
Section titled “Common Mistakes”- Calling
DifficultyScaler.scale()beforeProgressionManager.startLevel()—currentLeveldefaults to 1 andmaxLevelto 10, so values will reflect level 1 rather than the intended level. - Not unsubscribing
LevelStartSignal/LevelCompleteSignal/LevelFailSignalinonDestroy— stale callbacks fire after the subscribing node is destroyed. - Calling
completeLevel()andfailLevel()in the same frame —_isLevelActiveis cleared by whichever runs first; the second signal will still fire butisLevelActiveis already false. - ES2017 target: do not use optional chaining (
?.) or nullish coalescing (??) in game code.
Gotchas
Section titled “Gotchas”- Progress savepoints in playable ads are session-only — never expect persistence; treat
localStorageas opt-in fallback for bundle previews. - Skip events invalidate progression state — handle a skip event arriving mid-progression without a stale-state lock.