pub struct Loop {
pub id: LoopId,
pub region: StealthZone,
pub to: Mark,
pub requires_flags: Vec<FlagId>,
pub forbids_flags: Vec<FlagId>,
pub requires_state: Vec<StateCompare>,
pub counts: Option<StateId>,
pub on_cross: Vec<QuestEffect>,
}Expand description
A stage-5 loop (spec-0086): a slab a body crosses and is returned from, by a whole-block offset, to an earlier section that looks exactly the same — its position inside the cell, its facing and its velocity all kept.
§It is a region with a standing property
A loop acts on whatever body enters a volume, every tick, the way a
LethalVolume does; nothing completes and nobody is addressed. So it is
declared beside the lethal volume, with the same region type
(StealthZone, resolved through the one Plan::zone_box), and not as a
trigger with a relative teleport in it: the seamlessness proof is a property
of the region-plus-offset pair, which a compiler would otherwise have to
recognise by pattern-matching a trigger’s effect list.
§The offset is derived, never typed
to is a Mark naming where the slab’s own anchor cell lands, so the
offset is cell(to) − cell(region.anchor) — a whole-block vector by
construction, and a judgement about the world (the fourth bay’s anchor lands
on the second’s) rather than a vector the compiler could compute.
§The gate is the release
The loop holds while its gate is open and stands down while it is shut,
read against the party: flags are campaign state, and a requires_state term
must name a party datum (DW0949). A loop with no gate term holds forever
and is refused at the document (DW0949).
Fields§
§id: LoopIdUnique loop id (loop/<kebab>).
region: StealthZoneThe slab a body crosses: an anchor-centred box (anchor ± extent), one
axis of which is the crossing axis. The existing zone type, for the reason
LethalVolume::region gives.
to: MarkWhere the slab’s own anchor cell lands: the loop’s offset is
cell(to) − cell(region.anchor). Lies inside its anchor’s piece
(DW0897).
requires_flags: Vec<FlagId>Flags that must all be set for the loop to hold.
forbids_flags: Vec<FlagId>Flags any one of which stands the loop down — forbids_flags: [flag/the-bell-found] is a loop that ends the moment the bell is found.
requires_state: Vec<StateCompare>Numeric gate terms: every comparison must hold for the loop to hold. Each
names a party-scoped datum (DW0949). The third field of the one gate,
carried by every gate consumer.
counts: Option<StateId>A party-scoped datum the loop raises by one on every move, before
on_cross runs — the counter a crossing-counted release reads.
on_cross: Vec<QuestEffect>The dungeon’s answer to a move: effects run on every move, after the body
is moved and the count raised, from the server command source (no acting
player). Each effect’s own when keys a write to a count. A teleport
here is refused (DW0949).
Implementations§
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Loop
impl<'de> Deserialize<'de> for Loop
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for Loop
impl JsonSchema for Loop
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read more