Scenarios, tests, AetherDb templates and name-keyed maps now resolve designs by the generic names (231 literals in 30 files); TargetingCatalog's product texts lose the authoring note, Steadfast carries its r3 text, DragOnBreath plight's old design text. Not built yet; tests that depend on the generic-designs command and new tests follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
48 lines
2.5 KiB
C#
48 lines
2.5 KiB
C#
using System.Linq;
|
|
using static CultMath.math;
|
|
using static ItemRotation;
|
|
|
|
public sealed class Belt : Scenario
|
|
{
|
|
public override string Name => "Belt";
|
|
public override string Brief => "The biggest asteroid belt the generator made, with the Longinus parked 100 m outside its ring, facing along it, " +
|
|
"and nothing else in the arena. Verify: next and previous target step through the rocks and the reticle sweeps " +
|
|
"across the belt without a hitch; Previous with nothing targeted takes the farthest rock; the target indicator " +
|
|
"sits on the rock it names.";
|
|
|
|
// Seeds 1-256 scanned for the arena whose entrance zone holds the belt with the most asteroids: seed 24, a belt of
|
|
// 615 rocks. The next four: 179 (553), 251 (548), 221 (532), 29 (515).
|
|
public override uint Seed => 24;
|
|
public override bool Ambient => false;
|
|
|
|
public override Galaxy Generate(GalaxyStage stage) => stage.Prelude(DemoTerminus.Cast);
|
|
|
|
public override void Stage(ScenarioStage stage)
|
|
{
|
|
var fighter = stage.Fit("Longinus",
|
|
("Cockpit 2x2", int2(2, 6), None),
|
|
("Large Drive", int2(1, 0), Reversed),
|
|
("Large Drive", int2(3, 0), Reversed),
|
|
("Rugged Drive", int2(2, 14), CounterClockwise),
|
|
("Rugged Drive", int2(3, 14), Clockwise),
|
|
("Compact Reactor", int2(2, 4), None),
|
|
("Guided Missile Launcher", int2(0, 5), None),
|
|
("Guided Missile Launcher", int2(5, 5), None),
|
|
("Lightning Projector", int2(1, 8), None),
|
|
("Cell Blaster", int2(4, 8), None),
|
|
("Radiator", int2(2, 2), CounterClockwise),
|
|
("Radiator", int2(3, 2), Clockwise),
|
|
("Compact Sensor", int2(3, 10), None),
|
|
("Fire Control Array", int2(1, 6), Clockwise));
|
|
|
|
// The belt is a ring about its parent's position at the belt orbit's distance. The player stands 100 m outside
|
|
// it, at the point nearest the origin, facing along the ring.
|
|
var arena = stage.Arena;
|
|
var belt = arena.Planets.Values.OfType<AsteroidBeltData>().OrderByDescending(candidate => candidate.Asteroids.Length).First();
|
|
var orbit = arena.Orbits[belt.Orbit.Key].Data;
|
|
var centre = arena.GetOrbitPosition(orbit.Parent.Key);
|
|
var outward = lengthsq(centre) > 0f ? normalize(-centre) : float2(1, 0);
|
|
var at = centre + outward * (orbit.Distance + 100f);
|
|
stage.Player(fighter, at, facing: float2(-outward.y, outward.x));
|
|
}
|
|
}
|