phase 9: biome expansion — 3 biomes, 40 elements, 119 reactions, 9 species

Expand beyond vertical slice with two new biomes and massive chemistry expansion:

Chemistry: +20 real elements (Li→U), +39 compounds (acids/salts/oxides/organics),
+85 reactions (Haber process, thermite variants, smelting, fermentation, etc.)

Biomes: Kinetic Mountains (physics/mechanics themed) and Verdant Forests
(biology/ecology themed), each with 8 tile types and unique generation rules.

Creatures: 6 new species — Pendulums/Mechanoids/Resonators (mountains),
Symbiotes/Mimics/Spore-bearers (forests). Species filtered by biome.

Infrastructure: CradleScene biome selector UI, generic world generator
(tile lookup by property instead of hardcoded names), actinide element category.

487 tests passing (32 new).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Денис Шкабатур
2026-02-12 17:27:15 +03:00
parent 3c24205e72
commit 6ba0746bb9
16 changed files with 2176 additions and 39 deletions

View File

@@ -71,8 +71,8 @@ function createPlayerEntity(world: World, x: number, y: number): number {
// ─── Species Data ────────────────────────────────────────────────
describe('Species Data', () => {
it('loads 3 species from JSON', () => {
expect(allSpecies).toHaveLength(3);
it('loads 9 species from JSON (3 per biome)', () => {
expect(allSpecies).toHaveLength(9);
});
it('has Crystallid with correct properties', () => {
@@ -128,7 +128,7 @@ describe('Species Registry', () => {
});
it('has correct count', () => {
expect(registry.count).toBe(3);
expect(registry.count).toBe(9);
});
it('looks up by string ID', () => {
@@ -148,7 +148,27 @@ describe('Species Registry', () => {
it('returns all species', () => {
const all = registry.getAll();
expect(all).toHaveLength(3);
expect(all).toHaveLength(9);
});
it('can look up new Phase 9 species', () => {
expect(registry.get('pendulum')?.biome).toBe('kinetic-mountains');
expect(registry.get('mechanoid')?.biome).toBe('kinetic-mountains');
expect(registry.get('resonator')?.biome).toBe('kinetic-mountains');
expect(registry.get('symbiote')?.biome).toBe('verdant-forests');
expect(registry.get('mimic')?.biome).toBe('verdant-forests');
expect(registry.get('spore-bearer')?.biome).toBe('verdant-forests');
});
it('each biome has exactly 3 species', () => {
const all = registry.getAll();
const byBiome = new Map<string, number>();
for (const s of all) {
byBiome.set(s.biome, (byBiome.get(s.biome) ?? 0) + 1);
}
expect(byBiome.get('catalytic-wastes')).toBe(3);
expect(byBiome.get('kinetic-mountains')).toBe(3);
expect(byBiome.get('verdant-forests')).toBe(3);
});
});