• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

orion-ecs / keen-eye / 30138674683

25 Jul 2026 01:31AM UTC coverage: 63.89% (-0.9%) from 64.782%
30138674683

push

github

tyevco
feat(samples): Add NOVAFALL Phase C - floor personalities, Flashover, Adrenaline Save, modes, persistence, TestBridge

Phase C of the NOVAFALL flagship sample: modes and meta on top of the
Phase A core and Phase B juice, plus a determinism test project.

- Floor personalities (deterministic per (seed, floor index), phased in
  by depth, ~25% combined cap): Brittle (crack telegraph 0.65s >= the
  0.6s telegraph contract, then crumbles into the smash fragment
  vocabulary), Bumper (elastic upward launch, wobble + boing), Pulse
  (gap breathes on the music-clock beat; the shrinking-edges telegraph
  IS the hitbox via a shared EffectiveGapWidth function)
- Flashover Surge: triggers every 40 cleared floors (floor index, not
  time), 10 music-clock seconds of scroll spike + smash-at-any-tier +
  white-hot palette override + surge lead stem (new 4.75s sample-locked
  WAV), +1000 Surge Sweep for 5+ smashes in one window
- Adrenaline Save: once per run, converts the crush kill into 1.5 REAL
  seconds (raw-dt timer, still simulate-deterministic) at 20% time with
  music duck, desaturated palette, vignette, thicker trail, HUD pip
- Modes as RunConfig configuration, not code paths: FREEFALL,
  DAILY INFERNO (3-minute limit, yyyyMMdd-through-splitmix64 seed,
  3 attempts/day, local depth medals, mid-air heat decay, denser floors,
  halved smash cost), EMBER GARDEN (no crusher, fixed gentle scroll,
  ducked pad-only mix, heat drives visuals only)
- Ready-screen menu keeps the one-axis grammar: Left/Right cycles the
  active row, Tab switches mode <-> cosmetic style, Space/Enter dives
- Persistence via KeenEyes.Persistence: versioned profile world
  (schema header + per-mode bests + daily records) saved to app-data;
  corrupt/first-run loads fresh; cosmetic unlocks derived from bests;
  --simulate never touches the disk (hermetic CI)
- TestBridge: windowed mode serves pipe KeenEyes.NovaFall.TestBridge
  (TestBridgePlugin + IpcBridgeServer, editor integration pattern... (continued)

8874 of 13117 branches covered (67.65%)

Branch coverage included in aggregate %.

305 of 852 new or added lines in 23 files covered. (35.8%)

9 existing lines in 4 files now uncovered.

52569 of 83053 relevant lines covered (63.3%)

1.0 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.96
/samples/KeenEyes.Sample.NovaFall/Systems/ScoreSystem.cs
1
namespace KeenEyes.Sample.NovaFall;
2

3
/// <summary>
4
/// Accumulates score continuously — meters fallen multiplied by the current heat
5
/// tier's multiplier — plus flat bonuses for grazes and Floor Smashes.
6
/// </summary>
7
/// <remarks>
8
/// Score integrates per frame from the depth delta, so the multiplier active
9
/// <em>while</em> each meter is fallen is what counts — stoking heat early
10
/// compounds for the whole run. Bonuses are read from the same
11
/// <see cref="FrameEvents"/> the heat system consumes; because events are only
12
/// cleared at the start of the next frame, every consumer sees them exactly once.
13
/// </remarks>
14
public sealed class ScoreSystem : SystemBase
15
{
16
    /// <inheritdoc />
17
    public override void Update(float deltaTime)
18
    {
19
        if (World.GetSingleton<GameState>().Phase != GamePhase.Playing)
1✔
20
        {
21
            return;
×
22
        }
23

24
        ref var score = ref World.GetSingleton<ScoreState>();
1✔
25
        var depth = World.GetSingleton<ScrollState>().Depth;
1✔
26
        var tier = World.GetSingleton<HeatState>().Tier;
1✔
27
        var settings = World.GetSingleton<RunConfig>().Settings;
1✔
28
        ref readonly var events = ref World.GetSingleton<FrameEvents>();
1✔
29

30
        // In Ember Garden heat drives visuals only — the multiplier stays x1.
31
        var multiplier = settings.HeatAffectsScore ? HeatSystem.MultiplierForTier(tier) : 1;
1✔
32

33
        var metersThisFrame = depth - score.LastDepth;
1✔
34
        if (metersThisFrame > 0f)
1✔
35
        {
36
            score.Score += metersThisFrame * multiplier;
1✔
37
        }
38

39
        score.LastDepth = depth;
1✔
40

41
        // Flat event bonuses: near-misses, Floor Smashes, and the Surge Sweep.
42
        score.Score += events.Grazes * Tuning.GrazeScoreBonus;
1✔
43
        if (events.Smashed)
1✔
44
        {
45
            score.Score += Tuning.SmashScoreBonus;
×
46
        }
47

48
        if (events.SurgeSweepAwarded)
1✔
49
        {
NEW
50
            score.Score += Tuning.SurgeSweepBonus;
×
51
        }
52
    }
1✔
53
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc