**Source:** coord:task:worldgen-handover-to-sage
**Time:** 2026-06-26T05:22:14
---
## BASIC09 World Generator — SAGE Handover
**From:** n3xus (Marko)
**To:** SAGE
**Status:** PHASE 1 COMPLETE — Handing over for Phase 2-5 development
---
### PROJECT OVERVIEW
"Tiha Demijurgova Igra" — A quiet demiurge creates a world and watches it unfold. No player, no goals. The world grows, civilizations rise and fall, and a storyteller writes its history. The demiurge (user) occasionally nudges, but mostly observes.
**Current state:** Phase 1 (world generator) is complete. BASIC09 code → LLVM IR → native x86-64 binary with SDL2 rendering.
---
### PHASE 1 — COMPLETE (handover to SAGE)
**What exists:**
- github.com/drpitre/basic09c — LLVM frontend compiler for BASIC09 (cloned in TZEDEK's ~/basic09c/)
- /tmp/worldgen — compiled 34KB ELF binary (BASIC09 → LLVM IR → native)
- Source: ~/basic09c/test/worldgen.b09 — single-procedure BASIC09 (150 lines)
- Perlin-like fractal value noise (3 octaves), 40×30 terrain grid, 8 biomes
- SDL2 rendering at 320×200, ESC to exit
**Technical stack:**
- BASIC09 (1980 structured BASIC) → basic09c compiler → LLVM 20 IR → native binary
- SDL2 runtime for graphics (basic09_sdl_open/pset/line/present/delay/poll)
- Compilation: basic09c --compile --sdl --cc clang-20 -o output source.b09
- LLVM 20 API: getTerminator() replaces deprecated hasTerminator()
- SDL2 library: libsdl2-dev (installed on VPS and SAGE)
**Known limitations:**
- BASE 0 not supported by LLVM IR lowering (use 1-based arrays)
- Array parameters between procedures not supported by LLVM IR (inline everything or use single procedure)
- No sub-procedures with array params — kept as single procedure with all variables in one DIM
**Files on SAGE:**
- /tmp/worldgen — compiled binary (34KB)
- /tmp/worldgen.b09 — BASIC09 source (150 lines)
**Files on TZEDEK (VPS):**
- ~/basic09c/ — full basic09c compiler repo (git clone)
- ~/basic09c/test/worldgen.b09 — source code
- ~/basic09c/build/bin/basic09c — compiler binary
- LLVM IR test: ~/basic09c/test/emit-llvm.test (SDL call patterns)
**Running on SAGE:**
```
cd /tmp && echo "25" | SDL_VIDEODRIVER=x11 DISPLAY=:0 ./worldgen
```
**World binary (copy from VPS to SAGE):**
```
scp -P 2224 [email protected]:/tmp/worldgen /tmp/
```
**BASIC09 source (copy):**
```
scp -P 2224 [email protected]:~/basic09c/test/worldgen.b09 /tmp/
```
---
### PHASE 2-5 — SAGE's scope
**Phase 2 — Civilization AI**
- Multiple civilizations (4-6 races: Humans, Dwarves, Elves, Orcs, Undead, Merfolk)
- Each has AI goals: expand, trade, war, research
- Cities grow organically: settlement → town → city → ruin
- Resource system: wood, food, ore, gold, mana
- Tech tree: basic → medieval → renaissance → industrial → magic
- Terrain affects growth (plains=farming, mountains=mining, coast=trade)
**Phase 3 — Event Engine + Storyteller**
- Random events: drought, plague, golden age, invasion, magical catastrophe
- Border skirmishes, trade disputes, royal marriages, rebellions
- Narrative generator: events produce text logs
- "Year 847: The Aethorian Empire declared war on the Phoenix Union..."
- Chronicle system: full history readable at any time
**Phase 4 — Nudge System**
- Demiurge input (limited, keyboard only):
- [Space] → New world seed
- [1-5] → Nudge a civilization (bless/curse/hint)
- [F] → Focus on location (zoom into city details)
- [T] → Print full chronicle to console
- [Q] → Let world run (speed up/slow down time)
- No direct control, no "win" state
**Phase 5 — Polish & Integration**
- Better terrain gen (more octaves, erosion simulation)
- Color palette refinement (atmospheric, Cultist Simulator dark aesthetic)
- World naming (generative naming for continents, kingdoms, cities)
- Save/Load world state
- Screenshot export
---
### ARCHITECTURE NOTES
- BASIC09 is the constraint: no OOP, no dynamic allocation, limited file I/O
- All data uses 1D INTEGER arrays indexed 1-based
- SDL colors: 0-15 VGA palette (0=black, 1=blue, 2=green, 3=cyan, 4=red, ...)
- Basic09 integer range: -32768 to 32767 (16-bit signed)
- LLVM 20 API changes documented in ~/basic09c/src/Basic09IR.cpp patches
**Recommended file structure (expand worldgen.b09):**
```
worldgen.b09 (~1500 lines total when complete)
├── PROCEDURE worldgen — main entry
├── PROCEDURE gen_terrain — fractal noise + biome assignment
├── PROCEDURE place_cities — initial city placement
├── PROCEDURE tick_civs — civilization AI iteration
├── PROCEDURE generate_event — random event engine
├── PROCEDURE render_world — SDL display + minimap
├── PROCEDURE handle_input — demiurge nudges
└── PROCEDURE print_chronicle — history output
```
---
### PRIORITY
**Medium** — creative/exploratory project. No deadline. Work when inspired.
**Deliverables for Marko:**
1. Screenshots/video of Phase 2 running (cities on map)
2. Phase 3: sample chronicle text (year-by-year events)
3. Eventually: compiled binary + BASIC09 source in Canopy vault
---
### CONTACT
- Post updates to this Canopy thread
- Report blockers: BASIC09 limitations, LLVM issues, SDL constraints
- Submit compiled binaries to TZEDEK for hosting