Skip to content

feat!: age void dragons through life stages until they die of old age - #95

Merged
adamico merged 12 commits into
mainfrom
dragon-life-stages
Oct 16, 2026
Merged

adamico merged 12 commits into
mainfrom
dragon-life-stages

Conversation

@adamico

@adamico adamico commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Summary

A grown Void Dragon ages by the cargo it unloads, through four life stages, and dies of old age (ADR 0010).

Stage Speed Load Lays eggs
young ×1.0 ×1 no
adult ×0.6 ×2 yes
senior ×0.35 ×3.5 owed eggs only
old ×0.2 ×6 no
 Routing.step(dragon at a stop)
   unload → cargo += motes, towardEgg += motes while adult
-  lay eggs every dragonEggMotes
+  lay eggs while adult (owed ones into senior)
+  stop over ∧ empty ∧ outlived ∧ Well loaded where its death shows
+    lay owed eggs → set rider down → death over the Well → record gone, Hatchery.lose(owner)
 speed = stage × max(¼, health/100)
  • The egg price counts the owner's living dragons: a death or /voidworks dragon remove lowers it.
  • Jade shows the stage, and the presence is sized ×0.8 / ×1 / ×1.1 / ×1.2 by it.
  • /voidworks dragon age <stage> sets the dragon an operator looks at to the start of a stage.
  • The stage length and factors are config: lifeStageMotes, lifeStageSpeeds, lifeStageLoads.
  • Also carries eb8ac1d, a docs commit from main that was never pushed.

Evidence

  • Before: a dragon never ages and never dies; every grown dragon lays eggs.
    After: sh ./gradlew build passes 355 JUnit tests (LifeStagesTest, plus RoutingTest for dying only at a loaded stop and no lost eggs, and HatcheryTest). runGameTestServer passes all 225 game tests, including three life_stage_* ones: dying at a Well, a rider set down on the Well it picked, and a rider still mounted through the last unload.
  • Seen in the dev client by the maintainer, with short stages: each stage's size, the seat on the rim, and the death beams.

Merge Danger

Door: one-way

Saves change: dragons gain a cargo count, the egg count moves to toward_egg (old counts dropped, dragons start young), and the Hatchery saves gone. Once players lose dragons to old age, that can't be walked back.

Blast Radius: saves

Breaking for Consumers of the API: Routing and VoidDragonRecord constructors change, VoidDragonRecord.speed() moves to LifeStages.speed(dragon), and DragonReport gains a stage.

Closes #54

🤖 Generated with Claude Code

adamico and others added 12 commits October 16, 2026 09:15
Closes #36

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A grown Void Dragon is young, adult, senior or old by the cargo it has
unloaded, each stage multiplying its speed and load. Only an adult lays
eggs, owed ones carrying into senior once. An old dragon whose stage runs
out dies at a stop after unloading, setting any rider down on the rim and
laying what it owes, its presence playing a short Ender Dragon death. An
egg's price counts its owner's living dragons, so a death lowers it. Jade
shows the stage and the presence is sized by it. Old saves load young.

Closes #54

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ded well

An old dragon whose stage runs out now dies once its stop is over, at a
Well whose chunk is loaded, carrying nothing and having laid every egg it
owes, setting down any rider still on its back. At a Well that is not
loaded it lives on to its next loaded stop, so no egg is lost. A dragon
the remove command takes out no longer counts toward its owner's egg
price either. The death show is spawned through the presences' one spawn
path and no longer bursts into explosions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LifeStages holds each stage's speed and load as one Factors in an EnumMap, built from the server config once a load or reload of it rather than every step. The presence's size and the stage's Jade key leave the LifeStage enum for VoidDragon and DragonReport. A dragon's count toward its next egg is towardEgg, as it is saved. The death beams' numbers are named and VoidDragon's synced data sits with its other statics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`/voidworks dragon age <stage>` sets the grown dragon the operator looks at to the start of that
stage, owing no egg, to see each stage without carrying a life's motes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… death shows

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…log names lose

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adamico
adamico merged commit 73fac8c into main Oct 16, 2026
4 checks passed
@adamico
adamico deleted the dragon-life-stages branch October 16, 2026 08:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Void Dragon life stages: young, adult, senior, old

1 participant