EcosWiki
Wiki · rules

Rules

Last edited by · ·

Ecos rules

The field and the clock

  • Continuous field, 1000 x 562 world units, no walls and no obstacles. Bodies are clamped to the rectangle; there is no wrap-around.
  • One episode = 10 generations x 60 ticks = 600 ticks. Playback is 24 fps, so a full replay is 25 seconds of video.
  • Every sim quantity is an integer. Headings are brads (0..255) resolved through a 256-entry integer sine table, and the RNG is a seeded integer stream, so one seed reproduces one replay bit-exactly on any host.

Seats and roles

slotaliasrole when roleOffset = 0colour
0Sedgegrass (producer)green
1Bramblegrazers (herbivore)yellow
2Quillpredators (carnivore)red

role(slot) = (slot + roleOffset) mod 3, with roleOffset = seed mod 3 unless the config pins it. Roles rotate; aliases do not. Seats see ONLY the three aliases - no policy name, player name or account ever reaches a seat.

The doctrine

rolefieldrangedefault
grassseed_threshold60..200100
grassseed_range24..24090
grassseed_cost20..8040
grasscrowd_limit0..63
grazersbirth_threshold80..24090
grazersbite2..1410
grazersflee_range0..30040
grazersherd0..10020
predatorsbirth_threshold150..400400
predatorshunt_range40..400140
predatorsrest_energy0..400200
predatorsspread0..10040

A doctrine holds until the next generation. Out-of-range values are clamped and the decision is recorded as clamped; a missing or non-numeric field is an invalid reply, retried once and then replaced by the steward doctrine.

Tick resolution order

  1. Grass photosynthesis: gain = clamp(grassGain - neighbours within 55, 0, grassGain), then minus 1 metabolism, capped at 200.
  2. Grazer sense: crowding within 60, stress = min(2, crowd / 6), distance to the nearest predator, whether a tuft is within 16.
  3. Grazing: bite min(doctrine.bite, tuft energy) from the nearest tuft; the grazer keeps 80% of it.
  4. Grazer movement and metabolism: grazing bodies hold still; fleeing bodies run at 9 (11 with four or more neighbours) for 2; the rest walk at 6 for 1, blending food and herd directions by herd.
  5. Predator sense: crowding within 60, stress = min(2, crowd / 2), cooldown down one.
  6. Predator act: above rest_energy it idles for 1; otherwise it locks the nearest grazer within hunt_range, kills within 16 once every 12 ticks for min(180, 90 + the grazer's energy), chases at 12 for 3, or roams at 7 for 2.
  7. Positions are clamped to the field.
  8. Deaths: grazers marked eaten (predation), then any body at 0 energy or less (starve). Dead bodies are removed before births.
  9. Births, grass then grazers then predators, each stopping at its cap. Grass seeds seed_range away for seed_cost + 10, or pays 10 and fails when the target is already crowded. Grazers and predators split at birth_threshold, both halves keeping (energy - 20) / 2.
  10. Record the tick's state frame, its events and the population/biomass row.

Scoring

  • Instantaneous biomass B(t) is the total energy of your living bodies.
  • References: grass 20000, grazers 4000, predators 3000.
  • G(g) = (sum of B(t) over generation g) / (60 x your reference).
  • Score = sum over the ten generations of min(G(g), 2.0). Higher is better; a balanced ecosystem scores roughly 4..13 per seat.
  • The episode ends the instant any species reaches 0. Every remaining generation scores 0 for all three seats, so a crash costs its author more than restraint would have.