01What random events are for
Not variety. Rubber-banding, and a reason to hold cash.
Random events in a 4X are usually justified as "flavour" — a bit of texture so no two games feel identical. ROTP's implementation is doing something more specific, and the giveaway is one default-on option called eventsFavorWeak. Bad events are aimed by industrial power at the strongest empire. Good events are aimed by inverse power at the weakest. The event system is a rubber band, and it says so in the source.
The second job is subtler. Two of the worst events — plague and supernova — are not damage. They are bills, payable in banked reserve BC, and the colony dies if you can't cover them. Two more, piracy and comet, are health bars that only armed ships parked in orbit can chew through. Between them, four of the twenty events convert "I keep no reserve and no home fleet" from a mild inefficiency into a real risk. That is the entire mechanical argument for keeping a treasury in a game whose economy otherwise rewards spending every credit.
Everything else in the roster is a one-shot nudge: a planet gets richer or poorer, a research pool is wiped, a colony revolts, someone finds a derelict full of technology.
02The rising clock
One roll per turn, against a probability that grows until something happens.
There is no per-event probability table. There is a single accumulator on the galaxy:
private static final float START_CHANCE = 0.0f; private static final float CHANCE_INCR = 0.01f; private static final float MAX_CHANCE_INCR = 0.05f; // ... each turn, inside nextTurn(): eventChance = min(maxChanceIncr(), eventChance + chanceIncr()); if (turnRnd() > eventChance) return; ... RandomEvent triggeredEvent = listRnd(subList); eventChance = START_CHANCE; // Reset the probability counter
So the per-turn chance climbs 1% → 2% → 3% → 4% → 5%, then holds at 5% until something fires, at which point it drops back to zero and starts climbing again. Both the increment and the ceiling are multiplied by the eventsPace option, which runs 20%–500% around a default of 100%.
Integrating that sequence gives a mean gap of about 22 turns between events at default pace — but the distribution is deliberately lopsided. There is only a 14% chance of an event in the first five turns after one fires, and a 60% chance within twenty. Back-to-back disasters are structurally impossible; a decade of total quiet is unlikely.
The two turn gates
eventsStartTurn — nothing fires before this turn, and the accumulator doesn't even begin climbingdelayTurn × difficultyFactor; the factor is 4 / 3 / 2 / 1 for Easiest / Easier / Easy / everything abovedelayTurn set to −1 turns that event off permanentlyThe difficulty multiplier is the quiet one. On the easy settings every event that carries a delay is pushed out two to four times as far — which matters almost entirely for the monsters, whose delays are 100, 100 and 25 turns.
03Who gets hit
Power-weighted roulette, in both directions.
Once an event is chosen, an empire is chosen for it. With eventsFavorWeak on — the default — the two selectors are mirror images:
// empireForBadEvent(): chance based on power for each empire float power = emp.extinct() ? 0 : emp.industrialPowerLevel(emp); vals[i] = power; total += power; // ... roulette wheel over vals[] // empireForGoodEvent(): chance based on 1/power for each empire float power = emp.extinct() ? 0 : emp.industrialPowerLevel(emp); if (power > 0) power = 1/power; vals[i] = power;
The weighting is on industrial power, not fleet strength or territory — so the empire the events punish is the one with the most factories, which in ROTP is very nearly always the empire that is winning. Turn the option off and the target is simply uniform over living empires.
Because good events use 1/power rather than "rank from the bottom", the weighting is far more aggressive on the good side than the bad. Doubling your industry halves your odds of a windfall but only doubles your odds of a disaster relative to a rival — and since a runaway leader's industry can be five or ten times the trailing AI's, the gifts are effectively locked to the bottom of the table long before the punishments concentrate at the top.
04The wasted roll
The event is picked before anyone checks whether it can happen.
The selection is uniform and unweighted over an eligible sublist — every event that isn't disabled, isn't too early, wasn't the last one to fire, and isn't already running:
private boolean isValidEvent(RandomEvent event) {
if (!opts.allowRandomEvent(event)) return false; // option gate
if (galaxy().currentTurn() < event.minimumTurn()) return false; // too early
if (allowConcurrence(event)) return true; // multi-monster
if (event == lastEvent) return false; // no repeats in a row
...
for (RandomEvent ev: activeEvents)
if (event == ev) return false; // already running
return true;
}
What that list does not check is whether the event has anywhere to land. There is no canTriggerFor(Empire) in the interface. The event is chosen, the accumulator is reset to zero, the empire is chosen, and only then does trigger(Empire) scan for a suitable colony — and quietly return if it finds none.
The eligibility filters are not trivial, either. Earthquake, plague and supernova all need a colony of at least 30 population. Plague and supernova additionally need one with no research project already running. Assassination needs a contacted, non-hostile empire inside economic range. Piracy needs an active trade agreement. Early in the game — right at turn 50, when the global gate lifts — a large fraction of picks find nothing.
Every one of those misses still costs the turn, because eventChance was zeroed the moment the event was selected. The effective rate of events that actually do something is meaningfully lower than the nominal one-every-22-turns, and it is lowest exactly when the galaxy is smallest and colonies are least likely to clear the population thresholds.
05All twenty events
Registration order. Every one is equally likely when eligible.
| Event | Kind | Requires | Effect |
|---|---|---|---|
| Donation | good | — | turn × 10 BC to the treasury. Uncapped and linear in game year. |
| Enriched Planet | good | not already rich, not artifact | Planet resources → Rich. |
| Depleted Planet | bad | not already poor, not artifact | Planet resources → Poor. |
| Fertile Planet | good | not hostile / fertile / gaia | Soil enriched: Normal → Fertile, plus a base-size increase. |
| Boost Planet Size | good | base size ≤ 50 | +50 base size on one colony. The single largest free gift in the roster. |
| Computer Virus | bad | a non-empty research pool | Finds the largest accumulated pool among Computer / Force Field / Propulsion / Weapon and wipes 100% of it. Never touches Construction or Planetology. |
| Earthquake | bad | population ≥ 30 | −20% to −30% population and −30% to −80% factories, rolled independently. |
| Industrial Accident | bad | factories ≥ 30 | Planet → Radiated, base size re-rolled, terraforming zeroed, waste maxed. Effectively destroys the world. |
| Rebellion | bad | not the capital, not already rebelling | inciteRebels(0.5) — converts half the population to rebels, which always clears the threshold for full revolt. |
| Ancient Derelict | good | unknown techs in range | Up to 10 free technologies at level ≤ current +10. |
| Assassination | bad | a peaceful contact in range; not final war | Frames the target empire as the assassin. See §10. |
| Plague | bad | pop ≥ 30, no project, not rebelling | Ongoing. 5–10% population per turn, compounding, plus quarantine. See §6. |
| Supernova | bad | pop ≥ 30, no project, not the capital | Ongoing, 5–15 turn fuse. Pay or the world dies. See §6. |
| Piracy | bad | an active trade agreement | Ongoing. 60–90% of empire-wide trade income. See §7. |
| Comet | bad | — | Ongoing, 10–15 turn fuse. Shoot it or lose the colony. See §7. |
| Precursor Relic | good | — | Galaxy-wide. Every asteroid field becomes a real, colonisable planet; one becomes an artifact world. Plus 5 free Construction techs. |
| Gauntlet Relic | good | — | Galaxy-wide. Halves the population of every colony of every empire. See §9. |
| Space Amoeba | monster | delay 100 turns; off by default | Roaming. Destroys colonies, planet → Barren. |
| Space Crystal | monster | delay 100 turns; off by default | Roaming. Destroys colonies, planet → Dead, waste maxed. |
| Space Pirates | monster | delay 25 turns; off by default | Roaming. Pillages: −50% population, all factories, max waste. |
06Disasters with an invoice
Plague and supernova aren't damage — they're a bill, denominated in production.
Both implement ColonyResearchProject: they attach themselves to the afflicted colony's research slot, which is why neither can land on a colony that already has a project running. You clear them by paying, and the price is a multiple of what the colony earns:
| Plague | Supernova | |
|---|---|---|
| Cost to clear | roll(3,10) × totalProductionIncome | turnsNeeded × totalProductionIncome |
| Time limit | none | roll(5,15) turns |
| Damage while active | roll(5,10)% of population per turn, compounding | none |
| Side effect | Quarantine — the colony is embargoed, killing its trade | — |
| If unpaid | The colony shrinks toward nothing | Planet → Radiated, base size re-rolled to roll(11,20), colony gone |
| Excluded target | rebelling colonies | the capital |
The two are deliberately different problems. The supernova is a countdown with a known price and a known deadline — it is a budgeting decision, and a cheap enough colony is worth deliberately abandoning. The plague has no deadline, so it looks survivable, and isn't:
researchNeeded is fixed at 3–10× the colony's income at the moment of infection, but the colony pays from current production while losing 5–10% of its population every turn. A colony that can't clear the bill quickly will never clear it — its income falls faster than the debt does. And because ROTP's economy is already sunk into factories, the only fast money is banked reserve. This event, more than any other, is the reason to keep one.
If a plagued or supernova-bound colony changes hands mid-event, the project transfers with it and researchRemaining is reset to the full amount for the new owner. Invading a plague world buys you the whole bill from scratch.
07Disasters with a health bar
Piracy and comet are killed by parked warships, and by nothing else.
Both events carry hit points and both use the identical damage function — the only place in ROTP where a fleet's composition matters without a battle happening:
for (int i = 0; i < ShipDesignLab.MAX_DESIGNS; i++) {
if (fl.num(i) > 0) {
int size = fl.design(i).size();
float weight = pow(5, size);
dmgInflicted += (fl.num(i) * weight);
}
}
pirateHP = max(0, pirateHP - dmgInflicted);
Hull size is a zero-based index, so the per-ship contribution is 1 / 5 / 25 / 125 for Small / Medium / Large / Huge. Weapons, armour and tech level are irrelevant; only tonnage counts. Only armed fleets belonging to the afflicted empire or its allies contribute, and they must be in orbit.
piracyRate = HP/500, so it opens at 60%–90% of trade income lost40 × turnsNeeded, where the fuse is 10–15 turnsTwo details are easy to miss. First, piracy's penalty is empire-wide — it is applied as tradePiracyRate on the empire, not on the raided colony, so a single pirate incursion taxes every trade agreement you hold. Second, the rate falls as you damage them: chipping the pirates from 450 HP to 200 drops the trade loss from 90% to 40% without killing them, so partial progress pays immediately.
The comet is all-or-nothing in the other direction. Nothing happens for 10–15 turns, and then sufferImpactEvent destroys the colony and downgrades the planet to Barren. There is no partial impact.
08The windfalls
Five gifts, one of which quietly rewrites the map.
The small ones are small: a donation of turn × 10 credits, a planet upgraded to Rich, soil enriched from Normal to Fertile. Two are large enough to change a game.
Boost Planet Size adds a flat +50 base size to any colony under 50 — which is to say it can triple a marginal world. Given that base size is the ceiling on population and population is the council vote, this is the most valuable single-colony event in the roster.
Precursor Relic is galaxy-scale. It walks every star system in the galaxy and converts every asteroid field into a real, colonisable planet:
for (StarSystem sys : galaxy().starSystems())
if (sys.planet().type().isAsteroids())
systems.add(sys);
if (!systems.isEmpty()) {
float richArtifactProb = 0.02f;
for (StarSystem sys : systems) {
do { sys.planet(PlanetFactory.createPlanet(sys, session().populationBonus())); }
while (sys.hasAsteroid());
sys.addEvent(new SystemRandomEvent("SYSEVENT_PRECURSOR_RELIC"));
if (rng().nextFloat() < richArtifactProb) {
richArtifactProb = 0;
sys.planet().setArtifact();
if (rng().nextBoolean()) sys.planet().setResourceUltraRich();
else sys.planet().setResourceRich();
}
}
}
Every dead rock in the galaxy becomes settleable at once, and exactly one of them (2% per system until it hits, then the probability is zeroed) becomes an Antaran-ruins artifact world with Rich or Ultra-Rich resources. The nominated empire also gets 5 free Construction techs — but the map change benefits everyone, and disproportionately whoever has the range and the colony ships to reach the new worlds first. It is a "good" event that hands the leader a bigger prize than its intended beneficiary.
Ancient Derelict grants up to 10 free technologies — nominally split between the Force Field and Weapon trees, though see §15 for why the weapons half doesn't work.
09The Gauntlet Relic
Classified as a good event. Halves the population of every colony in the galaxy.
@Override public boolean goodEvent() { return true; } // classify as positive event, has galactic effects
@Override public void trigger(Empire emp) {
// step through all colonized systems
// cut population on all colonies in half
for (Empire e: galaxy().empires()) {
for (StarSystem sys: e.allColonizedSystems()) {
sys.planet().colony().setPopulation( 0.5f * sys.population() );
}
}
...
// then, for the chosen empire only:
for (StarSystem sys : emp.allColonizedSystems()) {
Planet pl = sys.planet();
if (pl.baseSize() <= 90.0f)
pl.baseSize(pl.baseSize() + 10.0f);
}
// ... plus 5 free Planetology techs
This is the single most violent thing in the file. It halves the population of every colony of every empire, including the beneficiary's, and then hands one empire +10 base size on its smaller worlds and five free Planetology techs.
Two consequences follow from that goodEvent() flag. First, the beneficiary is chosen by the 1/power selector — so the free techs and the size increases go to the weakest empire while the population tax lands on everybody. Second, because the tax is proportional, the empire with the most population loses the most in absolute terms. It is the hardest rubber-band snap in the game, and it is delivered under the label "positive event."
Note also that the population halving runs before the null/extinct check on the beneficiary. Even a degenerate target can't stop the galaxy from taking the hit.
10Assassination — the only diplomatic event
The empire the event targets is the one that gets blamed.
Nineteen of the twenty events touch colonies, planets, tech or money. Exactly one reaches into the diplomacy ledger, and it does so from an unexpected direction:
if (galaxy().council().finalWar()) return;
for (Empire e: emp.contactedEmpires())
if (!emp.atWarWith(e.id) && emp.inEconomicRange(e.id))
emps.add(e);
if (emps.isEmpty()) return;
Empire assassin = emp; // the "targeted" empire
Empire victim = random(emps);
...
AssassinationIncident.create(assassin, victim);
The empire selected by the bad-event roulette is the assassin, not the victim. Since the bad-event selector aims at the strongest empire, the effect is to take whoever is winning and frame them for murdering a random peaceful neighbour who is close enough to trade with.
The incident is severe and immediate: −50 severity for 20 turns against the assassin in the victim's ledger, the ambassador recalled, and both triggersWar() and triggersImmediateWar() true — so this doesn't degrade relations, it declares a war. Every empire already at war with the victim gets a +50 / 10-turn praise incident toward the assassin and an opened embassy, so the leader is simultaneously handed a new enemy and a set of new friends among that enemy's enemies.
It is the cleanest expression of the whole system's intent: the game notices you are ahead, and manufactures a coalition problem.
11Monsters are off by default
Which is worth knowing before reading anything else about them.
The random-events setting has five values, and the shipped default is not "on":
public boolean allowRandomEvent(RandomEvent ev) {
switch(selectedRandomEventOption()) {
case RANDOM_EVENTS_ON: return true;
case RANDOM_EVENTS_OFF: return false;
case RANDOM_EVENTS_NO_MONSTERS: return !ev.monsterEvent(); // ← default
case RANDOM_EVENTS_TECH_MONSTERS: return ev.techDiscovered();
case RANDOM_EVENTS_ONLY_MONSTERS: return ev.monsterEvent() && ev.techDiscovered();
}
}
Under the default, the Amoeba, Crystal and Pirates never spawn at all. The two "tech" modes gate them behind a research trigger instead — Cloning:1 for the Amoeba, Stargate:0 for the Crystal, EngineWarp:8 for the Pirates — and the empire that researches the trigger tech becomes the monster's first target. That is a genuinely elegant coupling: it turns three specific technologies into a decision rather than a free upgrade, and it makes the tech leader the one who pays for being the tech leader.
Alongside the three roamers there are five stationary guardians (Guardian Amoeba, Guardian Crystal, Guardian Pirates, Space Jellyfish, Space Cuttlefish) that can be seeded onto planets at galaxy generation, with a probability scaling off planet size. That option's default is None, so outside Orion the galaxy generates without them too.
12The three roamers
A wandering monster is not a battle. It is a battle you have to choose to have.
Once loose, a monster picks a colonised system inside a ring 0–8 light years out, travels there over several turns with 2–5 turns of GNN warning, and arrives. The targeting is weighted against repetition:
protected float baseChance(StarSystem sys) {
return monster.vistedSystems().contains(sys.id) ? 0.05f : 0.25f;
}
protected float systemChance(StarSystem s) { return s.isColonized() ? baseChance(s) : 0; }
25% for a fresh colonised system, 5% for a revisit, and uncolonised systems are never chosen. It hunts people, not space.
Arrival is the interesting part:
monster.visitSystem(targetSysId);
monster.initCombat();
Colony col = targetSystem.colony();
if (!targetSystem.orbitingFleets().isEmpty())
startCombat();
else if ((col != null) && col.defense().isArmed())
startCombat();
if (monster.alive()) {
degradePlanet(targetSystem);
...moveToNextSystem();
}
An undefended colony gets no battle at all. If nothing is in orbit and the colony has no armed defence, the monster simply applies its damage and moves on. The fight is opt-in, and opting in is the only way to ever stop it — with the default max-systems setting of 0, a monster never dies of old age and roams indefinitely.
| Monster | What it does to the colony | Combat trick |
|---|---|---|
| Space Amoeba | Colony destroyed; factories cut to 10% (they survive as alien factories for a later re-coloniser); planet → Barren; waste reset. | Caps incoming damage at 500 per bucket and then splits by mitosis into two halves. Eats ships outright on its own tile — no damage roll — and ignores repulsors. |
| Space Crystal | Colony destroyed; planet → Dead; filled to maximum waste (size × 0.9). | Area pulsar: 1–1000 damage to all eight adjacent tiles, including its own side, plus −1 computer level and −5% repair rate per hit. Teleports each turn to the densest cluster. |
| Space Pirates | Pillages instead of destroying: −50% population, factories to zero, max waste. The colony and the planet type survive. | No special abilities — a scaling fleet whose tech ladder tracks the galaxy's highest average tech level minus two. |
The Amoeba's damage cap deserves a note, because it inverts normal combat logic. Alpha-striking it is wasted — anything over 500 in a bucket is discarded, and the surplus you did land triggers mitosis into two independent stacks next turn. The correct answer is many small, sustained hits, which is the exact opposite of the flat-shield arithmetic that governs every other fight in the game.
13Orion
The best planet in the galaxy, behind the hardest fight in the galaxy.
Orion isn't a random event — it is placed deterministically at galaxy generation, first among the unsettled systems, at coordinate index 0 of the galaxy shape. Its planet is built by a dedicated factory:
public static Planet createOrion(StarSystem sys, float bonus) {
Planet p = instance.options().orionPlanet(sys); // always Terran
p.setOrionArtifact(); // Orion ruins: 3 bonus techs
p.makeEnvironmentFertile();
p.baseSize(creationSizeMax() * bonus); // default max: 120
return p;
}
Terran, fertile, base size 120, Orion ruins worth 3 bonus technologies at minimum level 20, and a ×4 research multiplier on anything built there. Then the council bonus on top:
public float orionCouncilBonus() {
if (galaxy().orionSystem().empire() == this) return .2f;
return 0;
}
Note the condition: owning Orion, not killing its guardian. The +0.2 to every AI's vote calculation, and the automatic loyalty rule that makes any AI accept an Orion-holder's council election, both follow the deed rather than the kill.
The Guardian
Plus a Zyro shield, High Energy Focus, Advanced Damage Control, and immunity to stasis. Its combat stack overrides reloadWeapons() to grant exactly one shot per weapon slot per turn — which is why the source carries the comment "do not change this sequence" above the weapon assignments. The slot order is the firing priority, and it steps down from missiles at range 9 to torpedoes at range 10 to everything else at range 3.
The reward is fixed and guaranteed: ShipWeapon:16 — the Death Ray, learned outright, plus a KillGuardianIncident at severity 100 for 50 years broadcast to every empire that knows you. Killing the Guardian is simultaneously the best weapon in the game, the best planet in the game, a permanent council advantage, and the largest single positive diplomatic event available. It is the one place where ROTP puts everything behind a single door.
14Why this design works
Three properties, one of which is doing most of the work.
The accumulator beats a flat probability
A fixed 4%-per-turn chance would produce clusters — two disasters in three turns, then sixty quiet ones. The rising counter guarantees a gap after every event and guarantees pressure during a long quiet stretch. It is a memoryless system made non-memoryless for exactly the reason that makes games feel fair, and it costs three constants.
The rubber band is honest about being a rubber band
Power-weighted targeting is usually hidden. ROTP names the option eventsFavorWeak, defaults it on, and implements it as a plain roulette wheel over industrial power. The effect is that a runaway leader faces a rising tax on being ahead — assassination framing, earthquakes on their best worlds, a computer virus in their deepest research pool — while the trailing AI accumulates gifts. In a game where a snowballing 4X economy is otherwise unstoppable, this is the only counter-pressure that exists outside the council.
Four events make the treasury matter
ROTP's colony economy rewards spending everything on factories. Plague and supernova are payable only in banked reserve; piracy and comet are payable only in warships that aren't doing anything else. Together they put a price on total optimisation, without ever adding an upkeep mechanic. That is the events system earning its place: not as flavour, but as the reason two otherwise-dominant strategies have a cost.
The uniform, unweighted selection over twenty events means a trivial planet-resource nudge is exactly as likely as a galaxy-wide population halving. There is no severity budget and no escalation curve — the Gauntlet Relic can fire on turn 51. The result is a system whose variance is much larger than its designers' own difficulty settings, which is presumably why the monsters ship disabled.
15Quirks, dead code, and things that look wrong
Verified against the source, not inferred.
| What | Detail |
|---|---|
| "Unique" events aren't unique | minimumTurn() gates repeats on lastEndedTurn, which is only written by terminateEvent() — and only the four ongoing events and the monsters ever call it. For all fifteen instant events alreadyOccurred() is permanently false, so returnTurn = 0 ("fire once") does nothing. Ancient Derelict, Precursor Relic and the Gauntlet Relic can all fire an unlimited number of times. |
| The derelict never grants a weapon | RandomEventAncientDerelict's weapon block reads empTech.forceField().allowedTechs() where it should read weapon(). It then filters that Force Field list against Weapon known-techs and the Weapon tech level. The result: no weapon tech is ever granted, and force-field techs can enter the draw pool twice. |
| The accumulator resets on selection, not effect | eventChance = START_CHANCE runs before trigger(). An event that finds no eligible colony still consumes the turn and resets the counter — a systematic downward bias on the real event rate. |
| Fixed-events targeting is discarded | In fixed-events mode affectedEmpire = empireForFixedEvent() is assigned and then unconditionally overwritten on the next line by the favor-weak / uniform selector. The deterministic pick only survives on the pending-event path. |
| The supernova's per-turn damage doesn't exist | affectColony() opens with the comment // reduce population by 5-10% and then never touches population — it only re-attaches the project and checks the fuse. Copy-paste residue from the plague, which does implement it. |
| Two monster options are dead | nextSystemAllowed() reads selectedCrystalMaxSystems() for every monster type. piratesMaxSystems and amoebaMaxSystems are declared and shown in the options UI but never read; the crystal setting silently governs all three. |
| "Hard" monsters make the amoeba weaker | CombatStackSpaceAmoeba overrides the design's hull with if (monsterLevel == 1f) maxStackHits(3500); else maxStackHits(1500); — a float equality test against a computed level. Any setting other than exactly 100% (including the Hard preset, 1.4) drops the amoeba from 3500 to 1500 hit points. |
| Three amoeba HP tiers are unreachable | The design ladder tests < 0.75 → 1500, > 1.35 → 7500, then >= 2 → 15500, >= 4 → 31500, >= 8 → 63500. The > 1.35 branch swallows every larger value, so the top three tiers can never be produced. (Moot in practice, given the row above.) |
| The virus can't touch half the tree | RandomEventComputerVirus only considers Computer, Force Field, Propulsion and Weapon. Construction and Planetology research pools are immune. And because lostRP starts at 0 with a strict > comparison, an empire whose largest pool is exactly zero yields a null target and the event silently no-ops. |
| Fertile Planet can never make a Gaia world | enrichSoil() has a Fertile → Gaia branch, but the event's eligibility scan excludes any planet that is already Fertile. Only the Normal → Fertile path is reachable from this event. |
| The Space Cuttlefish has no weapon | Its monsterDesign() fits engine, computer, armour, shield, ECM, manoeuvre, Battle Scanner, Squid Ink and Resist Stasis — and never calls design.weapon(...), leaving every slot on the null entry. It is a damage sponge that can only ink. |
| Guardian Pirates have no name | A fusion guardian's display name is text("PLANET_" + monsterKey), so Guardian Pirates request PLANET_SPACE_PIRATES — a label that exists in no language file. |
| Orion's Guardian scales off the wrong knob | OrionGuardianShip overrides isFusionGuardian() back to false, so stackLevel() takes the roaming-monster difficulty value rather than the guardian one — even though its slider sits in the Guardian Monsters panel. The same override also keeps it out of orbitingFleets(), so UI and AI code reading that list sees an empty orbit at Orion. |
RandomEventGeneric is stillborn |
Its registration line is commented out, and both delayTurn() and returnTurn() return null — it would NPE inside minimumTurn() the moment it were registered. |