Skip to content
Zizeeria
Menu

News

Development log

Written for people who want to know how it works. Pre-production entries are drawn from the commit history rather than published as they happened.

Posts

The simulation runs

The ecosystem service ticks: populations, predation, food coupling and migration between regions, on a fifteen-minute cycle.

The service that makes this game different from the others is the first one we built past the schema. It holds a population per species per region, applies logistic growth against a carrying capacity, resolves predation with a saturating response, and moves animals across region borders when a region stops being able to feed them.

The saturating response is the part that matters. A naive predation term scales without limit and the model runs away inside a few ticks; with a handling time, predation saturates and the populations settle instead of oscillating into the safety cap. Every dial in the model is a row in the database, not a constant in the code, so tuning the world does not require a deployment.

The world data — species, the food chain, region borders, starting populations — lives in one file that both the service and the database seed read. It used to live in two, they drifted, and the copy in the seed ended up with predation rates a thousand times too large. One copy now.

The database schema

Accounts, characters, content, the ecosystem and the Chronicle, with migrations, seed data and a verification pass.

Items, creatures, loot tables, spawn tables, quests, abilities and balance values are rows. That is not a preference; it is the mechanism by which most changes ship without a client download. A hard-coded balance number anywhere in this project is a bug.

The Chronicle got its own table early, before there was anything to write into it, because its columns constrain the rest. It stores actor names as they were at the time rather than as foreign keys — a guild that renames itself does not get to rewrite what it did.

The seed brings up three regions, six Callings, twenty creatures and fifty items on a fresh database, and it is idempotent, because it runs after every schema rollback as well as on every new developer machine.

Repository and infrastructure

Monorepo layout, the Git/Perforce boundary, local infrastructure and the first meta-service.

Code is in Git and binary game content is in Perforce, and the boundary is the file type rather than the directory. Text a human wrote is versioned in Git; binary a tool produced needs exclusive locking and gigabyte-scale storage, which is the thing Perforce does and Git does not.

Continuous integration refuses files over a mebibyte, anything under the engine project tracked in Git, and anything credential-shaped. The jobs skip cleanly while a workspace is still empty, so a green build means what it says rather than meaning nothing ran.