Crossing scenario and Djinni Shakedown targets, with their staging tests

Crossing (seed 112, demo cast): the Arcs Longinus fit with plight and FastBlast+- under the Fire Control Array, a piloted
hostile Djinni crossing the bow inside 400 m, an unpiloted neutral one at 80% of plight's Range. Djinni Shakedown gains
bare Longinus targets Ahead (inside the generated Djinni's ballistic mount arc) and Abeam (outside it). CrossingConditions
and DjinniShakedownTargets read what each arena staged. Not yet verified on a full-suite run at this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-11 18:52:35 +02:00
commit 7ab267c314
5 changed files with 146 additions and 4 deletions

View file

@ -0,0 +1,44 @@
using static CultMath.math;
using static ItemRotation;
public sealed class Crossing : Scenario
{
public override string Name => "Crossing";
public override string Brief => "plight at the starboard gun and a FastBlast+- at the port gun, a fast Djinni crossing close ahead and an " +
"unpiloted one waiting at range. Verify: as the Djinni crosses close, FastBlast lands some and plight " +
"almost none; against the Djinni at range both land. Fly it again without the Fire Control Array: " +
"with it the small gun lands more.";
public override uint Seed => 112;
public override bool Ambient => false;
// Where the Djinni sit: the player is at the origin facing +z. The crosser starts ahead and to starboard, facing
// across the bow, and flies in under 400 m. The waiting Djinni sits inside plight's arc at 80% of its Range.
public static readonly CultMath.float2 CrosserAt = float2(250, 280), CrosserFacing = float2(-1, 0);
public const float PlightRange = 1216f; // plight's Range in metres, 1216.4 as the fit stands settled at rest
public static readonly CultMath.float2 Waiting = float2(0, PlightRange * .8f);
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));
stage.Player(fighter, float2(0, 0), facing: float2(0, 1));
stage.Place(stage.Generated("Djinni"), CrosserAt, facing: CrosserFacing, stance: ScenarioStance.Hostile, piloted: true);
stage.Place(stage.Bare("Djinni"), Waiting);
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0cc3edfb4b0e4ea485cce71354f41748
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -3,13 +3,22 @@ using float2 = CultMath.float2;
public sealed class DjinniShakedown : Scenario
{
public override string Name => "Djinni Shakedown";
public override string Brief => "A fitted Djinni in empty space. Verify: its thrusters move and turn it; with the hull " +
"offline and thrusters firing, its speed does not run away.";
public override string Brief => "A fitted Djinni in empty space, facing +z, with a bare hull dead ahead and one abeam. Verify: its thrusters " +
"move and turn it; with the hull offline and thrusters firing, its speed does not run away. Its " +
"articulated ballistic barrel points at the hull ahead when it bears, and rests at the arc edge while you " +
"aim at the hull abeam.";
public override uint Seed => 101;
public override bool Ambient => false;
// Where the targets sit: the ballistic mount faces +z, so Ahead is inside its arc and Abeam outside it.
public static readonly float2 Ahead = new float2(0, 400), Abeam = new float2(400, 0);
public override Galaxy Generate(GalaxyStage stage) => stage.Prelude();
public override void Stage(ScenarioStage stage) =>
public override void Stage(ScenarioStage stage)
{
stage.Player(stage.Generated("Djinni"), float2.zero);
stage.Place(stage.Bare("Longinus"), Ahead);
stage.Place(stage.Bare("Longinus"), Abeam);
}
}

View file

@ -9,6 +9,6 @@ public static class Scenarios
public static readonly Scenario[] Tests =
{
new DjinniShakedown(), new StarvedReactor(), new Arcs(), new Duel(), new LauncherAngles(), new LongHaul()
new DjinniShakedown(), new StarvedReactor(), new Arcs(), new Duel(), new LauncherAngles(), new LongHaul(), new Crossing()
};
}