Empyrean Challenge — Entities
Extracted from baseline.adoc and extended by project-defined rules.
Each entity lists its key fields, constraints, and relationships.
Game
| Field | Value |
|---|---|
| Cluster | Exactly one Cluster |
| Empires | Zero or more associated Empires |
A Game is the top-level game instance. It contains exactly one Cluster. It is also associated with Empire entities. This describes the domain relationship only and does not fix the in-memory ownership or storage layout.
Empire
| Field | Value |
|---|---|
| ID | Integer, unique, starts at 1 |
| Name | String, unique when converted to lowercase |
| HomeWorld | Assigned Planet |
| Player | Optional associated Player |
| Race | Derived from HomeWorld |
An Empire is the in-game faction that participates in a game. Empire IDs are assigned in creation order. Exactly one Empire is created for each player input record. The Empire name is taken from the corresponding player record. Each Empire is assigned a home world when it is created. An Empire belongs to a Game, not to the Cluster as a physical-world entity. An Empire may exist without a Player. If a Player quits, the Empire remains in the game and simply has no associated Player.
Player
| Field | Value |
|---|---|
| ID | Integer, unique |
| String, unique | |
| Empire | Optional associated Empire |
| Identity | May be addressed by ID or email |
Player is an out-of-game/controller entity rather than the in-game faction itself. Player-to-Empire assignment is optional and one-to-one when present. A Player controls at most one Empire. An Empire has at most one Player.
Race
| Field | Value |
|---|---|
| Definition | All Empires sharing the same HomeWorld |
| Kind | Derived grouping, not separately selected |
Race is determined by origin. All Empires assigned to the same home world belong to the same Race.
Cluster
A single cluster exists per game (one game per database).
| Field | Value |
|---|---|
| Shape | Cube |
| Side length | 31 |
| Coordinate range | 0–30 per axis |
| Coordinate display | 2-digit zero-padded (e.g. 00, 07, 30) |
| Notation | XX-YY-ZZ (e.g. 28-02-18) |
| Stars | 100 |
prng.IntN(n) produces [0, n-1]. To generate a coordinate in [0, 30] use prng.IntN(31) (i.e. IntN(clusterAxisSize) where clusterAxisSize = 31).
The Cluster is the physical world of stars, systems, and planets within a Game.
Star
| Field | Value |
|---|---|
| ID | Integer, unique, 1–100 |
| X, Y, Z | Coordinates in range [0, 30] per § 3 |
| Sequence | Integer 1–N assigned within its system per § 5; mapped to A, B, C… in reports |
| Orbits | 11 (numbered 1 = innermost, 11 = outermost) |
| Display label | XX-YY-ZZ for single-star systems; XX-YY-ZZ/S for multi-star systems |
In orders, XX-YY-ZZ/A is accepted as an alias for a single-star system but reports never emit the /A suffix for single-star systems.
System
| Field | Value |
|---|---|
| ID | Integer, unique, 1–N (N ≤ 100) |
| X, Y, Z | Coordinates shared by all member stars |
| Stars | Ordered slice of member stars, ascending by star ID |
| Display label | XX-YY-ZZ (e.g. 28-02-18) — used in reports and orders |
Systems are formed after all stars are placed in the cluster (per § 5). System IDs are assigned 1 to N in the order systems are first encountered iterating stars 1–100. A system’s coordinates equal those of its member stars (all members share the same point). Stars in the same system occupy each other’s orbit 11. A system with 2 stars is binary; 3 stars, trinary. Interstellar jumps within a binary/trinary system are treated as 0.2 light years.
Orbit
| Field | Value |
|---|---|
| Number | 1–11 |
| Occupant | Empty, a Planet, or another Star in orbit 11 of a multi-star system |
| Orbits 1–10 | May be empty or may contain exactly one planet |
| Orbit 11 | Always empty in a single-star system; occupied by another star in a multi-star system |
An orbit is a numbered slot within a star system. It is not itself a planet. Planet rules that depend on orbit use the orbit number of the slot the planet occupies.
Planet
| Field | Value |
|---|---|
| Orbit | The orbit number it occupies within its star |
| Type | Terrestrial, Asteroid, Gas Giant |
| Habitability | Integer 0–25 |
| Deposits | Zero or more natural resource deposits |
| Max resource deposits | 40 |
| Deposit count | Asteroid 1d40, Terrestrial 2d20, Gas Giant 4d10 |
| Home world capacity | Up to 25 Empires when designated as a home world |
A planet is the occupant of an orbit, not the orbit itself. If an orbit is empty, there is no planet for that orbit. Planet attributes such as habitability, deposits, colonies, and derived limits belong to the planet.
Type notes:
- Gas Giant — surface colonies on moons only; habitability from 1 to 20
- Terrestrial — spherical; not necessarily earth-like; habitability from 0 to 25
- Asteroid — represents an entire belt; habitability always 0
Habitability effects:
- Max open farms on surface = habitability × 100,000
- Max population without increased rebellion risk = habitability × 10,000,000
- Applies to open colonies only
- A terrestrial planet is habitable when habitability > 0
Home world rules:
- An eligible home world must be a terrestrial planet in orbit
3,4, or5 - A designated home world may host up to
25Empires - Multiple home worlds may exist in the same system
- Home world eligibility is determined per planet, not per system
Planet assignment algorithm (per star, orbits 1–10):
// Step 1 — Random assignment
for n := 1 to 10:
r := rnd(1, 100) // uniform integer, inclusive
if r <= 29: planetType[n] = TERRESTRIAL
elif r <= 34: planetType[n] = ASTEROID
elif r <= 41: planetType[n] = GAS_GIANT
else: planetType[n] = EMPTY
// Step 2 — Cap gas giants at 3; demote excess to ASTEROID, innermost first
for n := 1 to 10:
if count(planetType[1..10], GAS_GIANT) <= 3: break
if planetType[n] == GAS_GIANT: planetType[n] = ASTEROID
// Step 3 — Cap asteroids at 2; demote excess to TERRESTRIAL, innermost first
for n := 1 to 10:
if count(planetType[1..10], ASTEROID) <= 2: break
if planetType[n] == ASTEROID: planetType[n] = TERRESTRIAL
// Step 4 — Sort non-empty orbits by type (TERRESTRIAL < ASTEROID < GAS_GIANT),
// preserving which orbit indices are occupied. Empty orbits do not move.
occupied := [n for n in 1..10 where planetType[n] != EMPTY] // ascending
types := sort([planetType[n] for n in occupied]) // ascending by type value
for i := 0 to len(occupied)-1:
planetType[occupied[i]] = types[i]
// Step 5 — Create planets in the occupied orbit slots.
for n := 1 to 10:
if planetType[n] == EMPTY: continue
planet[n] = Planet{
Orbit: n,
Type: planetType[n],
}Deposit
Natural resource deposit located on a planet surface (terrestrial), asteroid, or gas giant moon.
| Field | Value |
|---|---|
| Max per planet | 40 |
| Types | Gold, Fuel, Metallics, Non-metallics |
| Discovery | Survey order (exact) or Probe (approximate) |
Mines may only be assigned to a deposit by a surface colony.
Quantity by type:
- Asteroid Gold: 100,000–5,000,000 units
- Terrestrial Gold: 100,000–1,000,000 units
- Fuel: 1,000,000–99,000,000 units
- Metallics: 1,000,000–99,000,000 units
- Non-metallics: 1,000,000–99,000,000 units
Per-planet caps:
- Terrestrial: max 1 Gold deposit
- Terrestrial: max 5 Fuel deposits
- Gas Giant: max 2 Fuel deposits
Cap resolution:
- If Gold is selected after the Gold cap is reached, convert the deposit to Fuel.
- If Fuel is selected after the Fuel cap is reached, convert the deposit by rolling
1d2:1= Metallics,2= Non-metallics.
Yield by planet type:
- Asteroid Gold:
1d3 - Asteroid Fuel:
3d6 - 2 - Asteroid Metallics:
3d10 - 2 - Asteroid Non-metallics:
3d10 - 2 - Gas Giant Fuel:
10d4 - 2 - Gas Giant Metallics:
10d6 - Gas Giant Non-metallics:
10d6 - Terrestrial Gold:
1d3, or3d4 - 3if habitability > 0 - Terrestrial Fuel:
10d4 - 2, or10d6if habitability > 0 - Terrestrial Metallics:
10d6, or10d8if habitability > 0 - Terrestrial Non-metallics:
10d6, or10d8if habitability > 0
Resource
| Name | Abbreviation | Use |
|---|---|---|
| Gold | GOLD | Economic exchange, wages |
| Fuel | FUEL | All production and transportation |
| Metallics | METS | Manufacturing |
| Non-metallics | NMTS | Manufacturing |
Natural resource units each have a mass of 1 mass unit.
Colony
Up to one colony of each type per player per planet.
| Type | Surface | Location | Life Support | Structural units per mass unit |
|---|---|---|---|---|
| Open | Yes | Habitable terrestrial only | Not required | 1 |
| Enclosed | Yes | Uninhabitable terrestrial or asteroid | Required | 5 |
| Orbiting | No | Any planet (in orbit) | Required | 10 |
Units in storage count as ½ their mass toward structural limits. Structural mass of the colony/ship itself is not counted.
Trade Station — a special orbiting colony with trade as its only function. Minimum: 3,000 structural units + 500 life support units + 100 professional units. Charges a 1% commission (paid by seller) on completed trades.
Home Planet Market — one per race’s home planet; same rules as a trade station, but independent of player control.
Ship
| Field | Value |
|---|---|
| Quantity per player per planet | Unlimited |
| Location | Always in orbit |
| Life support | Required |
| Structural units per mass unit | 10 |
| Factories | Not allowed |
Population
All population units represent 100 people. All units have a death rate of 0.0625% per turn (non-combat).
| Type | Composition | Payment (consumer goods/unit/turn) | Notes |
|---|---|---|---|
| Unemployables | — | 0.00 | Receives all birth increases (0.25%–2.5% of total pop per quarter) |
| Unskilled Workers | — | 0.125 | 2% of unemployables → unskilled when unemployables > 30% of total pop |
| Professionals | — | 0.375 | Trained from unskilled (5% of trainees graduate/turn; 1 PRO trains 100 trainees) |
| Soldiers | — | 0.25 (0.005 on ships) | Drafted from unskilled; may not exceed current soldier count per draft |
| Spies | 1 professional + 1 soldier | 0.375 + 0.25 | Limited to total soldier + professional count |
| Construction Workers | 1 professional + 1 unskilled | 0.375 + 0.125 | Limited to total professional + unskilled count |
| Rebels | (tally only) | n/a | 10% are militia; rebellion triggers when soldiers ≤ 2× rebel militia |
Starvation rule (when ration < 1/16 food unit per pop unit per turn):
S = (M - R) / M
// M = 1/16 (minimum food per pop unit without starvation)
// R = rationed amount (< M)
// S = fraction of colony population that starvesFarm
| Field | Value |
|---|---|
| TL range | 1–10 |
| Annual production (TL 1) | 100 food units |
| Annual production (TL 2–10) | 20 × TL food units |
| Mass per unit | 6 + TL |
| Fuel per turn | 0.5 × TL (TL 1–5); 1 × TL (TL 6–10) |
| Labor per unit | 3 unskilled workers + 1 professional |
| Max FRM-1 per planet | habitability × 100,000 |
- TL 1: open-colony farm (surface only)
- TL 2–5: hydroponic; surface colonies in orbits 1–5, or orbiting colonies
- TL 6–10: hydroponic with artificial sunlight; ships or colonies beyond orbit 5
Mine
| Field | Value |
|---|---|
| TL range | 1–10 |
| Annual production | 100 × TL mass units of resource |
| Mass per unit | 10 + (2 × TL) |
| Fuel per turn | 0.5 × TL |
| Labor per unit | 3 unskilled workers + 1 professional |
| Placement | Surface colonies only |
Mines are organized into mine groups; each group mines one deposit.
Factory
| Field | Value |
|---|---|
| TL range | 1–10 |
| Annual production capacity | 20 × TL mass units of output per unit |
| Mass per unit | 12 + (2 × TL) |
| Fuel per turn | 0.5 × TL |
| Placement | Colonies only (not ships) |
Factories are organized into factory groups; each group manufactures one unit type. Manufacturing cycle: 1 year (4 turns). Resources consumed in turn 1; units delivered after turn 4.
Factory group labor (unskilled workers and professionals per factory unit):
| Group size | Professionals | Unskilled Workers |
|---|---|---|
| 1–4 | 6 | 18 |
| 5–49 | 5 | 15 |
| 50–499 | 4 | 12 |
| 500–4,999 | 3 | 9 |
| 5,000–49,999 | 2 | 6 |
| 50,000+ | 1 | 3 |
Unskilled workers may be replaced by automation units.
Manufacturing costs (metallics + non-metallics per unit):
| Unit | Metallics | Non-metallics |
|---|---|---|
| Assault Weapon | 1 × TL | 1 × TL |
| Assault Craft | 3 × TL | 2 × TL |
| Anti-missile | 2 × TL | 2 × TL |
| Automation | 2 × TL | 2 × TL |
| Consumer Goods | 0.2 | 0.4 |
| Energy Shield | 25 × TL | 25 × TL |
| Energy Weapon | 5 × TL | 5 × TL |
| Factory | 8 + TL | 4 + TL |
| Farm | 4 + TL | 2 + TL |
| Hyper Engine | 25 × TL | 20 × TL |
| Life Support | 3 × TL | 5 × TL |
| Light Structural | 0.01 | 0.04 |
| Military Robots | 10 + TL | 10 + TL |
| Military Supplies | 0.02 | 0.02 |
| Mine | 5 + TL | 5 + TL |
| Missile | 2 × TL | 2 × TL |
| Missile Launcher | 15 × TL | 10 × TL |
| Sensor | 999 + TL | 1999 + TL |
| Space Drive | 15 × TL | 10 × TL |
| Structural | 0.1 | 0.4 |
| Transport | 3 × TL | 1 × TL |
Research: A factory group ordered to do research produces 1 research point per factory unit × TL per year.
Research points required for TL advancement:
| Target TL | Research Points |
|---|---|
| 2 | 100,000 |
| 3 | 200,000 |
| 4 | 400,000 |
| 5 | 800,000 |
| 6 | 1,600,000 |
| 7 | 3,200,000 |
| 8 | 6,400,000 |
| 9 | 12,800,000 |
| 10 | 25,600,000 |
Weapons Units
Assault Weapon
| Field | Value |
|---|---|
| Mass | 20 |
| Fuel | 0 |
| Operation | 1 soldier unit per assault weapon unit |
| Notes | Destroyed when its soldier is destroyed |
Assault Craft
| Field | Value |
|---|---|
| Mass | 5 × TL |
| Fuel (normal) | 0.1 per turn |
| Fuel (combat) | 0.01 × TL² per round trip |
| Capacity (combat) | 1 soldier unit |
| Combat factor | 10 × TL |
Military Robot
| Field | Value |
|---|---|
| Mass | (2 × TL) + 20 |
| Fuel | 0 |
| Replaces | TL × 2 soldier units |
| Combat factor | 2 × TL |
| Notes | Fights until killed (never surrenders) |
Missile
| Field | Value |
|---|---|
| Mass | 4 × TL |
| Damage per hit | 100 × TL mass units |
| Hit formula | H = M / D² (M = missiles fired, D = distance) |
| Launcher accuracy adjustment | Subtract avg launcher TL from D², minimum D² = 1 |
Missile Launcher
| Field | Value |
|---|---|
| Mass | 25 × TL |
| Rate of fire | 1 missile or 1 anti-missile per round |
| Notes | TL affects missile accuracy, not anti-missile accuracy |
Anti-missile
| Field | Value |
|---|---|
| Mass | 4 × TL |
| Hit rate vs missiles | (50 + TL × 5)% |
| Notes | Launched by missile launchers; does not reduce missile launch rate |
Energy Weapon
| Field | Value |
|---|---|
| Mass | 10 × TL |
| Fuel | 4 × TL per combat round |
| Energy per beam | 10 × TL |
| Damage formula | DA = ((F / D) × E) − SH (F = weapons fired, D = distance, E = energy per weapon, SH = shields) |
| Notes | Cannot fire surface-colony to surface-colony |
Energy Shield
| Field | Value |
|---|---|
| Mass | 50 × TL |
| Fuel | 10 × TL per combat round |
| Deflection | 10 × TL energy units per round |
Military Supplies
| Field | Value |
|---|---|
| Mass | 0.04 per unit |
| Consumption | 1 unit per soldier unit per combat round |
Propulsion Units
Hyper Engine
| Field | Value |
|---|---|
| Mass | 45 × TL |
| Jump range | TL light years |
| Capacity | 1,000 × TL mass units (excluding engine mass) |
| Fuel per jump | 40 × distance (light years) |
| Interplanetary jump | Always 0.1 light years |
| Interstellar jump | Ends in orbit 11 of target system |
| Binary system jump | 0.2 light years, may target any orbit |
| Notes | Mixed TL engines use lowest TL; only engines needed to move the load consume fuel |
Space Drive
| Field | Value |
|---|---|
| Mass | 25 × TL |
| Fuel | TL² per combat round (only during combat) |
| Thrust factor | TL² × 1,000 |
| Speed (combat) | Total thrust / ship mass = distance per round |
| Notes | Anti-gravity based; cannot be used for interplanetary or interstellar travel |
Support Units
Sensor
| Field | Value |
|---|---|
| Mass | 2,998 + (2 × TL) |
| Fuel | TL / 20 per turn |
| Probes per turn | TL |
| Auto-reports | Ship count + approx mass, colony count + approx mass + approx production, planet count + type + orbit |
| Approximation | log₁₀(actual value), truncated to integer |
Transport
| Field | Value |
|---|---|
| Mass | 4 × TL |
| Capacity (transfer) | TL² × 200 mass units per turn |
| Fuel (transfer) | TL² / 10 per turn, proportional to % capacity used |
| Capacity (combat) | 3 × TL mass units per round trip |
| Fuel (combat) | 0.01 × TL² per round trip |
| Operation | 1 professional per 10 transports (transfer only) |
| Notes | Will not transfer beyond life support or structural limits |
Life Support
| Field | Value |
|---|---|
| Mass | 8 × TL |
| Fuel | TL per turn |
| Supports | TL² population units |
Structural Unit
| Field | Value |
|---|---|
| Mass | 0.5 per unit |
| Houses | 1 mass unit |
Light Structural Unit
| Field | Value |
|---|---|
| Mass | 0.05 per unit |
| Houses | 1 mass unit |
| Manufacturing | Orbiting colonies only |
| Notes | Can substitute for regular structural units without exception |
Automation
| Field | Value |
|---|---|
| Mass | 4 × TL |
| Fuel | 0 |
| Replaces | TL unskilled worker units per automation unit |
| Use | Factories, farms, or mines |
Consumer Goods and Food
Consumer Goods
| Field | Value |
|---|---|
| Mass | 0.6 per unit |
| Source | Factories |
| Use | Population wages |
Food
| Field | Value |
|---|---|
| Mass | 6 per unit |
| Consumption | 0.25 units per population unit per turn |
| Starvation threshold | < 1/16 unit per population unit per turn |
Spy Unit
Composed unit: 1 soldier + 1 professional. One function per unit per turn; continues until re-ordered.
| Code | Function |
|---|---|
| A | Report rebel quantity and type |
| B | Convert 1 rebel unit to loyal population |
| C | Uncover foreign spy units (count + origin) |
| D | Suppress foreign spies (3 attackers destroy 1 defender; 1/6 of defenders destroy attackers; ±50% variance) |
| E | Incite rebellion (convert 1 loyal unit to rebel) |
| F | Obtain secrets (1 line of target’s turn report per spy per turn) |
Turn
| Field | Value |
|---|---|
| Value | Integer, starts at 0 and increments by 1 |
| Setup turn | Turn 0 |
| Time scale | 1 turn = 1 quarter of a galactic standard year |
| Report display | year.quarter |
Turn 0 is the setup turn and displays as 0.0.
For report display, turns after setup map to year and quarter as follows:
- Turn
1=1.1 - Turn
2=1.2 - Turn
3=1.3 - Turn
4=1.4 - Turn
5=2.1
The mapping is:
- For turn
0, display0.0 - For turn
n > 0, display( ((n - 1) / 4) + 1 ).( ((n - 1) % 4) + 1 )
Empire Assignment
| Field | Value |
|---|---|
| Current HomeWorld | The planet currently being used for Empire assignment |
| Capacity per world | 25 Empires |
| Initial selection | Choose the first eligible home world at random |
| Replacement rule | When full, choose a new eligible unused home world at random |
| Failure mode | Return an error and terminate setup if no required home world can be chosen |
| Randomness | Uses the game engine PRNG |
Empire creation before game start uses a current home world. The first current home world is chosen at random from all eligible planets. New Empires are assigned to that home world until it reaches capacity. When a new home world is needed and none is available, Empire creation returns an error and setup terminates. Given the same seed and the same player input, Empire creation must produce the same results.
Turn Sequence
Executed in this order each turn:
- Mining and farming production
- Manufacturing production
- Combat
- Set up orders
- Dis-assembly orders
- Build change orders
- Mining change orders
- Transfers
- Assembly orders
- Market and trade station activity
- Surveys
- Probe and sensor reports
- Espionage
- Ship movement
- Draft orders
- Pay and ration orders
- Rebellion
- Rebel increases
- Naming and control orders
- Population increases
- News service reports
General Rules
- Mass unit = 17,000 lbs (≈ 100 people)
- All fractions truncated (no rounding)
- 1 turn = 1 quarter of a galactic standard year
- Operational units must be assembled to function and dis-assembled for transfer. Dis-assembly causes a 10% loss (except spy and construction units). Units requiring assembly: space drives, sensors, automation, life support, energy weapons, energy shields, mines, factories, farms, hyper engines, structural units, light structural units, missile launchers.
- Victory: control ≥ 100 planets with no other player controlling ≥ 50 planets, for 4 consecutive turns.