Expand description
Waves: the mobs a fight spawns, their lanes, equipment, drops and attributes.
Structs§
- Enchanted
Item - The enchanted form of
EquipItem. - Item
Drop - The quest-token form of a
MobDrop. - MobAttributes
- Attribute overrides for a wave mob (DSL v0.4). Each field maps to a 1.21.11
minecraft:attribute component; an unset field keeps the vanilla base value. - MobEffect
- One permanent status effect on a wave mob (DSL v0.4), emitted as an ambient,
non-expiring
effect give. - MobEquipment
- Worn/held equipment for a wave mob (DSL v0.6). Each field is a vanilla item
id for the matching vanilla equipment slot; an unset slot stays empty —
except
main_hand, where the compiler’s armed-mob default (skeleton bow, wither-skeleton sword) still applies unless overridden. Emitted as the component-eraequipment/drop_chancessummon NBT (1.21.11 silently ignores legacyArmorItems/HandItemson/summon), all drop chances 0. - Slot
Drop - The worn-piece form of a
MobDrop. - Wave
- A combat wave (DSL v0.3): a bundle of mobs spawned at an anchor and slain to
complete a
killobjective. Emission (spec-0002): aspawn-waveeffect summons the mobs taggeddw_wave_<id>(AI enabled — they fight); aplayer_killed_entityadvancement per tag decrements a scoreboard countdown, and thekillobjective completes when the count reaches zero. - Wave
Lane - Tower-defense lane routing for a wave (spec-0016 §6), built on vanilla’s
Raider patrol system — the intended primitive, live-verified on 1.21.11
(
docs/notes/td-routing-spike.md). - WaveMob
- One mob stack in a
Wave.
Enums§
- Encounter
Tier - What a wave is billed as (DSL v0.7, spec-0023). Consumed by the validation ladder (the run’s combat plan) and — since spec-0016 §1’s undefeated re-seat — by one emission site: a bonfire refreshes a billed wave that is still standing. Nothing about the encounter itself is scaled from it.
- Equip
Item - One equipped item: either a bare item id, or an id carrying enchantments.
- Equip
Slot - One vanilla equipment slot, named exactly as the
MobEquipmentfield that fills it. The DSL name and the summon-NBT key differ (main_handvsmainhand), so both live here and nowhere else. - MobDrop
- One declared drop of an elite or boss (DSL v0.9).
- Wave
Summon - Where a wave’s mobs materialize (spec-0016 §6).
Constants§
- AGGRO_
EDGE_ NO_ RANGE - (spec-0016 §6) A
summon: aggro-edgewave mob declares noattributes.follow_range. That radius IS the summon ring — the distance at which the mob perceives the party — so it is authored, never guessed from a vanilla defaults table the compiler cannot verify. - BOSS_
RESPAWNS_ ON_ REST - (spec-0016 §1, spec-0023, souls ruling 5/7: “stage bosses never respawn
on rest”) A wave declares BOTH
tier: bossandrespawns_on_rest: true.tierandrespawns_on_restare two fields on the sameWavedeclaration — the only place a “boss” billing and a “re-seat on rest” contract can land on one another; anActorcarriestiertoo but has norespawns_on_restfield at all (it is killed by hand, never re-seated by a bonfire), so this is the sole structurally expressible violation of the ruling. A rest-respawning boss re-fight breaks the retry economy the ruling exists to protect: a boss is the campaign’s named fight, not trash pressure the party grinds back down every rest. Validation-tier (exit 1),dsl::validate. Prescription: droptier: bossif the encounter really is meant to re-seat (bill iteliteinstead), or droprespawns_on_restif it really is the boss. - DIFFICULTY_
UNDECLARED_ ACTORS - (v0.6) A campaign stages actors meant to fight — unleashed, or
declared
vulnerable— but declares noworld.difficulty, and the engine’s derivation (crate::derived_difficulty) shipspeacefulbecause it fields no wave and stages no body peaceful discards. Every such fighter is a species peaceful keeps, and on peaceful every hit it lands on a player whose damage scales with difficulty — a mob’s melee and its projectiles — is zero. Advisory (warning, exit 0): declaringworld.difficultysettles it. - DROP_
COLLECT_ UNORDERED - A
collectdropped_byis not ordered after the fight that produces it: nokillobjective for that wave precedes this collect in the objective graph. Without that edge “kill the boss, take its key” is an authoring intention the quest graph cannot prove, and the collect reads as reachable from the campaign’s first tick. - DROP_
COLLECT_ UNSOURCED - A
collectdropped_byis not backed by the wave it names: the wave declares no{item}drop of this objective’s item, the count asks for more copies than the wave’s mobs can yield, or the objective also declares acontainer(the item cannot come out of a box and off a body). - DROP_
NOT_ TIERED drops[]on an encounter that is not billedeliteorboss. Only a named fight leaves anything behind; an ordinary mob’s kit is never farmable (no-grind constitution), so the declaration is refused rather than silently making rank-and-file gear lootable.- DROP_
SLOT_ UNFILLED - A
drops[]slotentry does not name a distinct slot the same entity’sequipmentactually fills — the slot is empty, or the same slot is declared twice. A mob can only leave behind a piece it wears, and it can only leave it behind once. - ENCHANTMENT_
LEVEL - (spec-0021) An enchantment level is outside the 1..=255 range vanilla’s
minecraft:enchantmentscomponent can carry. - ENCHANTMENT_
UNKNOWN - (spec-0021) An
equipmentorlootenchantment id is not in the pinned 1.21.11 enchantment registry. - LANE_
INVALID - (spec-0016 §6) A wave’s TD
lane/summondeclaration is structurally invalid or internally contradictory: an emptywaypointslist, a waypoint anchor no area’s prefab provides, a repeated consecutive waypoint, anaggro_radiusoutside4..=64, a mob whoseattributes.follow_rangedisagrees withaggro_radius(they MUST be equal — a patrolling raider holds ground against a target it cannot engage), orlanetogether withsummon: aggro-edge(a lane IS the routing; aggro-edge is its opposite). - LANE_
NOT_ RAIDER - (spec-0016 §6) A lane wave contains a non-raider species.
Patrolling/patrol_targetare Raider NBT: on anything else they are dropped and the mob simply stands where it spawned. The admitted set is vanilla’s own#minecraft:raiderstag, read from the vendored tag table — never a species list this engine keeps. Non-raiders usesummon: aggro-edgeinstead. - LANE_
SQUAD_ TOO_ SMALL - (spec-0016 §6) A lane wave fields fewer than 2 mobs. A lone patroller
sets
Patrolling:0bon itself when it finds no companion within its follow range (vanilla), so a one-mob lane cancels itself. - LANE_
UNARMED - (spec-0016 §6) A lane
pillageris not holding a crossbow. Its only attack goal is the crossbow goal, so a pillager that acquires a target it has no runnable attack for freezes in place indefinitely — patrol blocked by the target, nothing to run instead (live-verified deadlock). - REST_
RESEAT_ NO_ BONFIRE - (spec-0016 §1) A wave declares
respawns_on_rest: truebut the campaign declares nobonfire— nothing can ever re-seat it, so the field is a silent no-op. Either add the bonfire the re-seat is meant to hang off, or drop the field.
Functions§
- enchantment_
component - The item component a stack’s enchantments are written to — vanilla’s own
rule (
EnchantmentHelper.getComponentTypeat 1.21.11): an enchanted book STORES its enchantments (minecraft:stored_enchantments, what an anvil applies to the item it is combined with), and every other item CARRIES them (minecraft:enchantments). Both are in the pinned 1.21.11data_component_typeregistry.