Slice 2: telemetry, vitals, chat, spawn/portal, rare, kills and combat stats

The frames the backend reads most, each pinned by a golden test written from
the original's source (field order, JSON types, string-formatted numbers,
mem_mb in bytes, the PascalCase aggregates Newtonsoft emits for combat_stats).
Coordinates repeat the original's float arithmetic from the landblock-local
float, so ew/ns carry the same float-widened values as before. Telemetry goes
out on connect and every 5 s, vitals every 5 s, combat stats every 10 s when
dirty. The rare meta-state switch is not carried over (owner decision); the
allegiance rare announcement and the !report reply are. Kill patterns and
combat patterns are the original's, unchanged.

Also fixes the tick scheduler re-arming repeating jobs from now instead of
from their due time, which made every cadence drift a frame late per period.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-25 12:12:22 +02:00
parent 5dbb294a96
commit 1ff0a40aeb
19 changed files with 1824 additions and 5 deletions

View file

@ -1,4 +1,7 @@
using OpenAC.MosswartMassacre.Backend;
using OpenAC.MosswartMassacre.Infrastructure;
using OpenAC.MosswartMassacre.Streams;
using OpenAC.MosswartMassacre.Trackers;
namespace OpenAC.MosswartMassacre;
@ -10,8 +13,20 @@ internal static class FeatureCatalog
{
public static void AddFeatures(MmContext context, BackendSession session, List<IMmFeature> features)
{
_ = context;
_ = session;
_ = features;
// Streams and session counters.
var delayed = new DelayedCommands(context);
var kills = new KillTracker(context.Clock);
var rares = new RareTracker(context, delayed);
var combat = new CombatStatsTracker(context);
var stats = new SessionStats(context, kills, rares);
var telemetry = new TelemetryStream(context, stats);
features.Add(stats);
features.Add(combat);
features.Add(new ChatRouter(context, kills, combat, rares));
features.Add(telemetry);
features.Add(new VitalsStream(context));
features.Add(new SpawnPortalStream(context));
features.Add(new BotControl(context));
session.AddConnectionListener(telemetry);
}
}