Moments an author meets
Each of these passes ledger check, and surprises a play or a game the first time. Write the play that shows it before you rely on it.
An auto fires as its target is made. An ability granted auto (grants Bolt auto by nearest) is asked of every body that comes into its reach, and a body made in reach is one: it fires in the make step itself, at tick 0, not "soon after". A play that makes a target beside a tower and then deals to it finds the bolt already landed. Expect the auto's hit straight after the make, then go on.
A read of an ended actor is refused. An actor destroyed is gone, and an ActorId the game kept of it reads nothing: World.Get and MaxOf refuse it in words (an ArgumentException, "a read of an actor that is gone", naming the value read), so a frame that reads a dead fighter's Health throws. One kind of gone actor still reads: one a rule's credit still names, which reads as it fell. The game keeps actors by number, in its seat, finds each when it asks, and asks World.Exists before it reads; a body whose number finds no actor is skipped before anything reads it:
// found by number each time it is asked, never an ActorId kept: the seat holds the number, an ended actor's number
// finds none, and a fighter is asked first whether it exists, since a world refuses a value read of one gone
public ActorId Fighter(int side) => W.ReadActor(FighterAt, side);
/// <summary>A side's fighter's number, as the plane and the kit know it, kept when the fighter is gone.</summary>
public long FighterNumber(int side) => W.ReadWhole(FighterAt, side);
/// <summary>A side's own actor's number, as the kit's viewer is told it.</summary>
public long SideNumber(int side) => W.ReadWhole(SideAt, side);
/// <summary>The side whose fighter has the number, or -1.</summary>
public int SideOf(long fighter) => fighter == FighterNumber(0) ? 0 : fighter == FighterNumber(1) ? 1 : -1;
/// <summary>A side's fighter's health, or "gone": a world asked a value of no actor refuses it.</summary>
public string Health(int side) => W.Exists(Fighter(side)) ? W.Get(Fighter(side), "Health").ToString() : "gone";In a play, expect b gone says it; a value expected of an ended actor fails as b is gone.
A report ends its flight, unless it pierces. A flight (flies up to 3s) is a missile the game moves; the world waits for the game's report of what it met, and the report ends it. One report a flight: after it, the activation is over, and a second report, or a report on an ability that winds up or channels instead of flying, is refused (NotFlying). A flight that pierces N flies on after a report of an actor its clause takes, until it has pierced N; the next report is its last, and so is its cap or a report of nothing. A game that reports a miss must report it too, or the flight runs to its cap.
And in this game's frame: the game gives its orders before the tick (BeforeTick), the movers it moved are told in one order, the world ticks once, and the game reads what happened after (AfterTick). An order given in AfterTick lands in the next tick's moment. Between two ticks the world's clock stands at the tick that ran last, and an order given there lands at that tick: an effect it applies counts its time from it, so one that lasts 1t ends as the next tick runs, before AfterTick reads it. The same effect applied by a rule inside a tick counts from that tick, and AfterTick reads it once. So a one-tick impulse the game reads at its next move, a jump, a bounce or a knockback turned into the body's speed, has no lasts: the game takes it off as it reads it, by a Remove order (traps.md).
From ledger-v3's guide/ledger-author/moments.md, last changed 2026-10-30.