Aetheria/Assets/Scripts/ServerShared/Scenarios/Belt.cs
Meta Vens 8128bce6ba Belt scenario: an arena on seed 24, whose entrance zone carries a 615-rock belt, the player parked 100 m outside its ring
Spec cut-scenarios-belt.r1. Scenarios/Belt.cs stages the Longinus at the ring's edge nearest the origin facing along it; BeltConditions in
BeltScenarioTests.cs pins it. Built and tested through ygg-verify in the next commit's verification.
2026-10-12 03:38:06 +02:00

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),
("Talaria", int2(2, 14), CounterClockwise),
("Talaria", int2(3, 14), Clockwise),
("Core Power", int2(2, 4), None),
("GT 3K", int2(0, 5), None),
("GT 3K", int2(5, 5), None),
("plight", int2(1, 8), None),
("FastBlast+-", int2(4, 8), None),
("Iapyx", int2(2, 2), CounterClockwise),
("Iapyx", int2(3, 2), Clockwise),
("not if i see you first", 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));
}
}