A trigger is never queued while that same (minion, trigger) is resolving;
more than DEATH_PHASE_LIMIT = 64 Death Phases is an error ('Death Phase
limit'); Assemble refuses and never offers ill-formed text (wellFormed /
well_formed); summon count > 1 places tokens in summon order. Modules 05-10,
both tracks. Four new Module 5 tests, a tools test that every shipped card
is well-formed, lessons 2, 3, 5, 13 and harness.md updated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
48 lines
2.1 KiB
Rust
48 lines
2.1 KiB
Rust
//! Engine core: generic rules machinery. Never name a specific card here.
|
|
//!
|
|
//! Module 1: every card in the game is an entity addressed by an id handle.
|
|
//! The engine knows which zone each entity is in, who owns it, and when it
|
|
//! entered play.
|
|
//!
|
|
//! Module 2: heroes, Health, Attack and Armor; triggered abilities; and the
|
|
//! action queue that resolves a Sequence depth-first, recording an event log.
|
|
//!
|
|
//! Module 3: deferred death. Damage and destroy effects only mark minions; the
|
|
//! Death Creation Step removes them when the outermost Phase ends, and Death
|
|
//! Phases resolve their Deathrattles until no new deaths occur.
|
|
//!
|
|
//! Module 4: auras as card data, Aura Updates at defined points, and one
|
|
//! routine that decides how many times a queued trigger activates. Playing a
|
|
//! minion from hand, and Battlecries. A second interceptor, replacement: the
|
|
//! steps that rewrite a Damage before it lands (a redirect, then Armor).
|
|
//!
|
|
//! Module 5: behaviour as data. Cards are definitions in the course's card format,
|
|
//! loaded from JSON; one interpreter turns their effects into actions. Assemble
|
|
//! builds a new card by swapping half of one card's text for half of another's, and
|
|
//! offers only results that are well-formed. A Sequence is bounded: a trigger never
|
|
//! nests inside itself, and more than `DEATH_PHASE_LIMIT` Death Phases is an error.
|
|
//!
|
|
//! Part II lives in `puzzle`: a second engine, for the rule-writing puzzle game,
|
|
//! beside the first.
|
|
//! Module 6: the grid, the lexer and the parser.
|
|
//! Module 7: `IS NOT`, and the resolution pass that turns parsed rules into rules in force.
|
|
|
|
mod assemble;
|
|
mod aura;
|
|
mod card;
|
|
mod death;
|
|
mod effect;
|
|
mod event;
|
|
pub mod puzzle;
|
|
mod queue;
|
|
mod world;
|
|
|
|
pub use assemble::{assemble, register_assembled, AssembleError, AssembleFailure, Half};
|
|
pub use card::{
|
|
well_formed, Aura, Card, CardDef, CardLibrary, CardType, Clause, Effect, PoolFilter,
|
|
RedirectFrom, RedirectTo, Stacking, Target, Trigger, TriggerOn,
|
|
};
|
|
pub use event::Event;
|
|
pub use queue::{run_sequence, summon, Action, Ctx, DamageStep, DAMAGE_STEPS, DEATH_PHASE_LIMIT};
|
|
pub use world::{Chooser, EntityId, PlayerId, World, Zone, HERO_HEALTH};
|