window.GDD = window.GDD || {}; function GameplayPage() { const [activeTab, setActiveTab] = React.useState('loop'); return (

MVP Gameplay Loop

The core loop: connect → spawn → navigate → mine → inventory → station → sell on the market → chat. Steps 1–7 work in Era 1 (single-player). Step 8 (Chat) requires multiplayer and ships in Era 2 (Phase 11). Each step is UI-driven. The player's main interface is tables, charts, and panels — not a cockpit.

{[ { id: 'loop', label: 'Core Loop' }, { id: 'security', label: 'Security Levels' }, { id: 'pirates', label: 'NPC Pirates' }, { id: 'concord', label: 'CONCORD' }, { id: 'insurance', label: 'Insurance' }, { id: 'missions', label: 'Missions' }, { id: 'travel', label: '🚀 Travel & Warp' }, { id: 'events', label: 'World Events UX' }, { id: 'balancer', label: '⚖ Balancing Agent' }, ].map(t => ( ))}
{activeTab === 'loop' && (<> {/* Loop steps */}
{[ { step: 1, title: 'Connect', desc: 'Player opens the app and connects to SpacetimeDB. Identity is established, player row loaded.', color: 'var(--cyan)' }, { step: 2, title: 'Spawn', desc: 'A player row and ship row exist; the ship appears in the shared star system for all subscribers.', color: 'var(--cyan)' }, { step: 3, title: 'Navigate (click & autopilot)', desc: 'Player clicks a point of interest — asteroid, station, hostile — and the ship automatically pilots there. No manual flight control at all. The player sets intent, the ship executes.', color: 'var(--green)' }, { step: 4, title: 'Mine (activate & wait)', desc: 'Player clicks an asteroid to approach, then activates mining modules. The ship navigates on its own. Mining runs on a timer. The decision is what to mine and when, not how.', color: 'var(--accent)' }, { step: 5, title: 'Inventory', desc: 'Ore appears in inventory panel. Quantity, type, and value visible. Player manages cargo space.', color: 'var(--purple)' }, { step: 6, title: 'Dock at Station', desc: 'Player docks at a station. Station UI becomes available: sell, market, refit.', color: 'var(--cyan)' }, { step: 7, title: 'Sell Ore', desc: 'Player sells ore through station UI for ISK (in-game currency). Simple fixed pricing for MVP; market orders later.', color: 'var(--accent)' }, { step: 8, title: 'Chat', desc: 'Players send and receive messages in current system. Basic rate limiting and length validation. Requires multiplayer — ships in Phase 11 (Era 2).', color: 'var(--green)' }, ].map((s, i) => (
{i < 7 &&
}
STEP {s.step}

{s.title}

{s.desc}

))}
GP-UI

Screen Specifications

{[ { name: 'Login / Connect', color: 'var(--cyan)', items: ['Display current SpacetimeDB identity', 'Show connection status indicator', 'Enter/choose display name'] }, { name: '3D Star Map', color: 'var(--accent)', items: ['Render ships, asteroids, station', 'Click-to-move navigation', 'Entity selection and info panel', 'Camera orbit/zoom controls'] }, { name: 'Ship Status', color: 'var(--green)', items: ['Ship name, class, owner', 'Current status (idle/mining/warping)', 'Cargo capacity used/total', 'Active action timer'] }, { name: 'Inventory', color: 'var(--purple)', items: ['Item type + quantity grid', 'Sell button (when docked)', 'Cargo capacity bar', 'Item value estimation'] }, { name: 'Station Panel', color: 'var(--cyan)', items: ['Dock/undock controls', 'Quick-sell ore for ISK', 'View station market orders', 'Fit ship (when docked)'] }, { name: 'Market', color: 'var(--accent)', items: ['Order book (buy/sell)', 'Price per unit + quantity', 'Place sell order from inventory', 'Station-filtered view'] }, { name: 'Chat', color: 'var(--green)', items: ['Local/system channel (instant)', 'Private messages (delayed by range)', 'Sender name + timestamp', 'Auto-scroll to latest'] }, { name: 'Combat HUD', color: 'var(--red)', items: ['Target selection + lock timer', 'Module activation buttons', 'Capacitor / shield / armor bars', 'Combat log / damage notifications'] }, { name: 'Bounty Board', color: 'var(--accent)', items: ['Active bounties by tier', 'Place bounty on player', 'Kill feed (galaxy-wide)', 'Your bounty status'] }, { name: 'Debug Panel', color: 'var(--muted)', items: ['Reducer call log with timestamps', 'Error display with stack trace', 'Connection metrics (latency, subscription count)', 'Entity count / state dump', 'SpacetimeDB table row counts', 'Agent tick scheduler status', 'Force-spawn NPC/entity controls (dev mode)', 'Game time display (tick counter, sim time)'] }, { name: 'Galaxy Map', color: 'var(--accent)', items: ['Region/constellation/system hierarchy', 'Faction territory overlay', 'Active world events (icons)', 'Fauna migration routes', 'Anomaly locations and timers', 'Story log access'] }, { name: 'World Event Panel', color: 'var(--green)', items: ['Active events in current region', 'Event countdown timers', 'Participation status', 'Story log for this event', 'Sensor alerts for nearby events'] }, ].map((screen, i) => (

{screen.name}

    {screen.items.map((item, j) =>
  • {item}
  • )}
))}
{/* Combat Model */}
GP-COMBAT

Combat Model

Combat style — FTL power management, not action. The player never directly controls the ship's movement or aiming. Instead, the player clicks a hostile target and the ship automatically navigates to engagement range and engages. The player's job is resource allocation — inspired by FTL: distribute reactor power between weapons, shields, engines, and auxiliary systems. Modules auto-cycle when powered. The skill is in when to reroute power (e.g. divert from engines to shields during a spike), which subsystem to target on the enemy, and fitting choices made before the fight. Combat exists to create economic consequences (ship loss, loot, insurance), not to be a reflex game.

PvE Content

  • NPC pirates spawn in belts and at gates
  • Difficulty scales with system security level
  • High-sec: weak frigates, easy kills
  • Low-sec/null: cruiser+ NPCs, dangerous but rewarding
  • Bounty payouts + module drops as loot
  • NPC ratting is a primary ISK faucet

Player Pirating

  • Players can attack other players in low-sec and null-sec
  • High-sec attacks trigger CONCORD response (ship destruction)
  • Pirates can loot cargo from destroyed ships
  • Piracy lowers security status → eventually locked out of high-sec
  • Bounty system creates natural consequences
  • Creates risk/reward dynamics for haulers and miners

Combat Flow (FTL-style resource management)

1. Click hostile target — ship auto-navigates to engagement range, no manual piloting
2. Auto-lock & engage — targeting computer locks on, weapons begin auto-cycling
3. Manage reactor power — FTL-style: drag power between Weapons / Shields / Engines / Aux
4. Pick subsystem to attack — target enemy shields, weapons, engines, or hull directly
5. React to damage — reroute power mid-fight: divert engines→shields when taking fire, shields→weapons to finish
6. Monitor capacitor — all systems drain energy; running dry = modules go offline
7. Destroy or flee — hull reaches 0 → ship explodes, loot drops, economic consequences
FTL DNA: The player's only input during combat is power allocation and subsystem targeting. The ship flies itself. Weapons fire themselves. The player is the chief engineer deciding where the reactor output goes — not the pilot or gunner.
GP-FAIL

Power Allocation Failure Modes

No free lunch. Every subsystem needs energy. When power is diverted away from a subsystem, it doesn't merely weaken — it fails. The reactor produces a fixed total output, and every allocation decision creates a vulnerability somewhere else. This is the core tension of the combat system.
SubsystemPowered BehaviorUnpowered Failure ModeReroute Time
Weapons Turrets auto-cycle at full rate. Missile launchers reload. Damage output at fitted value. No firing. Turrets cease fire. Missiles cannot launch. Active weapons go offline after 3s. Cannot deal damage. 2s to full power
Shields Shield booster recharges shield HP. Passive regen active. Damage absorption at full. No recharge. Shield HP stops regenerating. Existing shield HP decays at 2%/s. After 15s, shields at 0% and all damage hits armor directly. 3s to full regen
Engines Ship maintains orbit speed. Can close distance or withdraw. Evasion against tracking. Ship immobile. Speed drops to 0. No orbit, no approach, no withdrawal. Sitting duck — all hostile weapons have perfect tracking. Cannot flee. 2s to full speed
Auxiliary Active modules cycle normally: ECM jamming, sensor boosters, cap boosters, warfare links. No special abilities. All auxiliary modules go offline. ECM stops jamming. Sensors degrade. No capacitor boosting. Warfare links disconnect. 1.5s to full power

⚠ Red Alert Mode

When the ship takes shield-piercing damage (shields below 25% and taking armor hits), the HUD automatically enters Red Alert. Non-essential HUD elements collapse: chat minimizes, commodity ticker hides, overview panel shrinks to hostiles-only. The combat HUD expands to fill the viewport: shield/armor/hull bars enlarge, power allocation bars gain prominent markers, and a pulsing red border frames the screen. Audio alarm plays once.

Trigger: shields < 25% AND armor damage incoming · Clears: shields restored above 50% · Cannot be disabled

Reroute Timing

Power rerouting is not instant — there's a 1.5–3 second spool-up depending on the subsystem. This prevents instant reactive ping-pong between subsystems. The player must commit to a power distribution and accept the vulnerability window. Rerouting to shields (3s) is deliberately slower than rerouting to weapons (2s), creating a "damage race vs. survival" decision.

During spool-up: subsystem operates at 50% capacity · Visual: power bar fills with animation · Audio: reactor hum changes pitch
On death: Ship destroyed, cargo and modules partially lost (50% drop as loot, 50% destroyed). Player respawns at home station in a rookie frigate. Ship insurance partially reimburses the loss. See Ships & Fitting → DEATH (Ship Destruction) for full details.
{/* ═══ DYNAMIC WORLD ═══ */}
GP-WORLD

Dynamic Galaxy — Living World Events

The galaxy is alive. The server simulates a single persistent galaxy with hundreds of star systems, planets, moons, asteroid belts, space stations, wormholes, and anomalies. On top of this static geography runs a world simulation layer that spawns PvE events dynamically, creating a unique story for every server. No two servers ever tell the same tale.

Galaxy Structure

Single Galaxy, Many Systems

All players share one galaxy. The galaxy contains multiple regions, each with dozens of star systems. Systems are connected by stargates forming a navigable graph. Travel between systems takes time, creating geographic identity — the frontier feels different from the core.

Orbiting Objects & Celestials

Each system has a star, planets, moons, asteroid belts, and stations. Planets orbit their star on slow cycles; moons orbit planets. This is not cosmetic — orbital positions affect mining yields, travel times, and line-of-sight for sensors. The galaxy has real spatial rhythm.

World Event Categories

⚔ Faction Conflicts

NPC factions have territory, resources, and grievances. The server tracks faction relations as a dynamic matrix. When tensions cross a threshold, war erupts — faction fleets clash in contested systems, trade routes are disrupted, and players can choose sides or profit from the chaos.

Triggers: resource disputes, border skirmishes, diplomatic insults, player provocations

🌀 Space Anomalies

The galaxy spawns temporary spatial phenomena — wormholes, nebulae, radiation storms, gravity wells, dark matter corridors. Anomalies appear unannounced and expire on their own schedule. Some are dangerous, some are lucrative, all create time-limited opportunities that reward the first to arrive.

Lifespan: 15 min – 48 hrs · Rarity scales with distance from trade hubs

🐋 Space Fauna Migrations

Massive space creatures migrate across the galaxy on seasonal cycles — space whales, crystal leviathans, plasma mantas. Their migration routes cross player space, creating temporary resource hotspots (biological materials, rare isotopes) and navigation hazards. Players can hunt, follow, or study them.

Cycle: real-time weeks · Route shifts each migration · First contact is always a surprise

🏛 NPC Faction Events

NPC factions expand, contract, build stations, abandon outposts, and respond to player activity. A mining rush in a remote system might attract NPC traders, who attract pirates, who attract bounty hunters. The world reacts to player density and economic activity organically.

Includes: station construction, pirate raids, convoy escorts, refugee crises, tech discoveries

🌑 Cosmic Catastrophes

Rare galaxy-shaking events — a star going supernova, a rogue planet entering a system, a dormant wormhole network activating. These are the server-defining moments that players talk about for months. "Were you online when the Rhea star collapsed?" becomes server legend.

Frequency: ~1 per month · Permanently alters the galaxy map · Foreshadowed days in advance

📡 Signals & Mysteries

Unknown signals appear at random — derelict stations, alien artifacts, encrypted transmissions. Players investigate, decode, and sometimes trigger chain events. Some mysteries are one-shot puzzles; others are the opening move of a multi-week server arc that the world simulation has been building toward.

Discovery: player-initiated · Can trigger larger events · Some are red herrings

How the World Simulation Works

World Simulation Pipeline

Galaxy State — persistent topology: systems, gates, planets, stations, faction territories
World Tick — every 5 min, server evaluates galaxy state + player density + event cooldowns + faction matrix
Event Spawn — world tick may spawn an event: choose type, location, duration, severity based on weighted probabilities
Event Propagation — nearby players get sensor readings; distant players hear through news feed with delay
Event Resolution — events end by timer, player action, or cascading trigger; outcomes feed back into galaxy state
Story Log — every event is recorded in a server-wide story timeline; players can read "the history of this galaxy"

Player-Event Interaction

  • Players can participate in events (fight invaders, escort convoys, study anomalies)
  • Player actions can escalate or defuse events (kill the pirate boss → raid ends)
  • Player density attracts certain events (trade hubs get more NPC activity)
  • Player inaction lets events escalate naturally (uncontested raids grow larger)

Server-Uniqueness

  • Event seed is randomized per server — no two galaxies evolve the same way
  • Faction relationships drift based on what players actually do
  • A server where players are peaceful traders develops different world events than a server of pirates
  • The story timeline is the server's unique identity — "this is the galaxy where the Kaalani wiped out the Vren homeworld"
Design intent: The world simulation ensures that even when players are doing routine economic loops, something is always happening somewhere. The galaxy never feels static. A player who takes a week off returns to find the political map has shifted, a new anomaly appeared in their home system, or a migration route has changed. The world remembers, the world evolves, and the world tells a story that belongs to this server's players alone.
)} {/* ═══ SECURITY LEVELS ═══ */} {activeTab === 'security' && (<>
GP-SEC

Security Level System

Security levels define the rules of engagement. Every star system has a security status from +1.0 (safest) to −1.0 (lawless). Security 0.0 is explicitly null-sec — there is no border case. Systems at exactly 0.0 have the same rules as systems at −0.4: no CONCORD, no gate guns, full PvP freedom. This single number controls CONCORD response, NPC pirate spawns, PvE difficulty, and the economic risk/reward balance. Inspired by EVE Online's sec-space but simplified for the prototype's scope.

Security Bands

{[ { band: 'High-Sec', range: '+0.5 → +1.0', color: 'var(--green)', pvp: 'Aggression triggers CONCORD. PvP possible but punished.', concord: 'Immediate (3–8s). Lethal.', pirates: 'Weak frigates. Easy kills, low bounties.', risk: 'Very low risk. Baseline ore prices. Starter systems.' }, { band: 'Low-Sec', range: '+0.1 → +0.4', color: 'var(--accent)', pvp: 'No CONCORD. Gate/station guns fire on aggressors. PvP is free.', concord: 'None. Gate/station guns only.', pirates: 'Mixed frigates/destroyers. Moderate bounties.', risk: 'Medium risk. Better ore. Faction missions. Trade route choke points.' }, { band: 'Null-Sec', range: '0.0 → −0.4', color: 'var(--red)', pvp: 'No rules. No guns. Anything goes.', concord: 'None.', pirates: 'Cruiser+ NPCs. Dangerous. High bounties + rare loot.', risk: 'High risk. Richest ore. Best anomalies. Faction conflict zones.' }, { band: 'Deep Null', range: '−0.5 → −1.0', color: 'var(--purple)', pvp: 'No rules. Wormhole connections only.', concord: 'None.', pirates: 'Battlecruiser/battleship NPCs. Elite loot tables.', risk: 'Extreme risk. Unique resources. Story event spawning grounds.' }, ].map((row, i) => ( ))}
BandSec RangePvP RulesCONCORDNPC PiratesRisk / Reward
{row.band} {row.range} {row.pvp} {row.concord} {row.pirates} {row.risk}

Player Security Status

Gaining Status

  • Destroying NPC pirates: +0.01 to +0.05 per kill (scaled by NPC tier)
  • Completing NPC missions: +0.1 to +0.3 per mission
  • Passive recovery: +0.01 per hour while clean (no hostile acts)
  • Maximum: +5.0 ("exemplary citizen")

Losing Status

  • Attacking a player in high-sec: −0.5 to −2.0 (scaled by victim's ship value)
  • Destroying a player ship in high-sec: −2.0 to −5.0
  • Podding (if applicable): −5.0 (extreme penalty)
  • Below −2.0: barred from +0.8+ systems (CONCORD patrols eject)
  • Below −5.0: freely attackable anywhere ("outlaw")
GP-SEC-DB

Backend Impact

Schema Changes

systems — add column: security_level (Float, range −1.0 to +1.0, immutable at galaxy gen time)
players — add column: security_status (Float, range −10.0 to +5.0, default 0.0)
ships — add column: combat_flag (Enum: none / weaponstimer / suspect / criminal, with timestamp)
New reducer: adjust_security_status(player_id, delta, reason) — server-side only, never client-callable
)} {/* ═══ NPC PIRATES ═══ */} {activeTab === 'pirates' && (<>
GP-NPC

NPC Pirate AI

NPC pirates are the primary PvE threat and a core ISK faucet. They spawn in asteroid belts, at stargates, and in combat anomalies. Their difficulty scales with system security level — easy frigates in high-sec, deadly battleships in deep null. The pirate AI uses simple behavior templates, not machine learning: deterministic state machines that create believable behavior without unpredictable edge cases.

Spawning Rules

Spawn Locations

{[ { loc: 'Asteroid belt', rate: '1–3 NPCs per belt', trigger: 'Player enters belt or world tick' }, { loc: 'Stargate', rate: '0–2 NPCs per gate', trigger: 'World tick (low-sec/null only)' }, { loc: 'Combat anomaly', rate: '3–8 NPCs (waves)', trigger: 'Player warps to anomaly' }, { loc: 'Mission site', rate: 'Scripted per mission', trigger: 'Player accepts mission' }, ].map((r, i) => ( ))}
LocationSpawn RateTrigger
{r.loc} {r.rate} {r.trigger}

Spawn Conditions

  • Player proximity: NPCs spawn when a player enters a belt or anomaly ("pull" model). Gates spawn NPCs on world ticks only in low-sec/null.
  • Density cap: max 10 active NPCs per system. If at cap, oldest idle NPCs despawn.
  • Despawn: NPCs that have been idle (no aggro) for 5 minutes despawn. Combat NPCs persist until destroyed or player leaves system for 2+ minutes.
  • No spawn zones: within 20km of stations (safe zone). On-grid with a station = no NPC spawn.
  • World tick spawns: every 5 minutes, world tick may add NPCs to low-pop systems to keep them feeling dangerous.

Difficulty Tiers by Security Level

{[ { band: 'High-Sec', classes: 'Frigate (T1)', hp: '200–400', bounty: '500–2,000 ₢', behavior: 'Passive orbit. Low aggression. Flees below 30% HP.', loot: 'Basic modules, small ammo, common ore' }, { band: 'Low-Sec', classes: 'Frigate (T2), Destroyer', hp: '400–800', bounty: '2,000–8,000 ₢', behavior: 'Aggressive orbit. Target priority (weakest ship). Kites if outgunned.', loot: 'T2 modules, blueprint fragments, mid-tier ore' }, { band: 'Null-Sec', classes: 'Destroyer, Cruiser', hp: '800–2,500', bounty: '8,000–30,000 ₢', behavior: 'Coordinated packs. Spider tanking (remote reps). Escorts target jamming.', loot: 'Rare modules, full blueprints, rare minerals' }, { band: 'Deep Null', classes: 'Cruiser, Battlecruiser, Boss', hp: '2,500–12,000', bounty: '30,000–200,000 ₢', behavior: 'Boss mechanics. Phase triggers. Spawns reinforcements. Requires fleet tactics.', loot: 'Officer modules, ship BPCs, unique cosmetics, story items' }, ].map((row, i) => ( ))}
Sec BandNPC ClassesHull HPBountyBehaviorLoot
{row.band} {row.classes} {row.hp} {row.bounty} {row.behavior} {row.loot}

AI Behavior Templates

Deterministic state machines. Each NPC has a behavior template with a fixed set of states and transitions. No randomness in decision-making — the "intelligence" comes from the state machine's design, not from randomness. This makes NPC behavior predictable enough to learn but complex enough to be engaging.

NPC State Machine

IDLE → orbit spawn point, passive scan every 2s (aggro_scan agent)
AGGRO → target detected in aggro range (30km default) → transition to COMBAT
COMBAT → execute behavior template (orbit/approach/kite) → fight to death or flee threshold
FLEE → HP below flee threshold (30% default) → MWD away from player, warp out if possible
DEAD → generate loot, award bounty to damage contributor(s), schedule respawn
{[ { name: 'Orbit Kiter', color: 'var(--cyan)', desc: 'Maintains optimal range (15–20km). Orbits target at speed. Fires long-range weapons. If player closes distance, thrusts away. Good against slow ships.', stats: 'Preferred range: 15–20km · Speed bonus: +20% · Damage: low · Survivability: high', }, { name: 'Brawler', color: 'var(--red)', desc: 'Burns directly toward target. Gets into close range (2–5km) and applies heavy short-range damage. Vulnerable to kiting but devastating if they close.', stats: 'Preferred range: 2–5km · Speed bonus: +10% · Damage: high · Survivability: medium', }, { name: 'Shield Tank', color: 'var(--green)', desc: 'Prioritizes shield regeneration over damage. Self-reps during combat. Slow but durable. Good at outlasting opponents.', stats: 'Preferred range: 10–15km · Shield regen: +50% · Damage: medium · Survivability: very high', }, { name: 'Support / EWAR', color: 'var(--purple)', desc: 'Stays at range, jams target locks, disrupts targeting. Weak in direct combat but makes the pack deadlier. Always spawns with escorts.', stats: 'Preferred range: 20–30km · EWAR strength: medium · Damage: very low · Survivability: low (prioritizes escape)', }, ].map((tmpl, i) => (

{tmpl.name}

{tmpl.desc}

{tmpl.stats}
))}
GP-NPC-DB

Backend Impact

New Tables & Agents

npc_entitiesnpc_id, system_id, class_id, behavior_template, x/y/z, hull/armor/shield, target_id, state (idle/combat/flee/dead), spawn_location, spawn_time
npc_class_templatesclass_id, name, tier, hull_base, armor_base, shield_base, speed, damage, behavior, loot_table_id, bounty
loot_tablestable_id, entries (item_type, min_qty, max_qty, drop_chance), security_band
New agents: pirate_spawn (conditional, 300s), pirate_combat_tick (fixed, 1s per engaged NPC), pirate_loot_drop (one-shot, 0s on death)
)} {/* ═══ CONCORD ═══ */} {activeTab === 'concord' && (<>
GP-CONC

CONCORD — Law Enforcement

CONCORD is the NPC police force in high-security space. They do not prevent crime — they punish it. High-sec is not safe; it is consequential. A determined player can destroy a target in high-sec, but they will lose their ship to CONCORD. This creates a cost equation: is the target's loot worth more than the attacker's ship? Most of the time, it isn't.

Response Model

{[ { sec: '1.0', time: '3s', force: '2 Battleships + 2 Cruisers', outcome: 'Near-instant destruction. No time for a second volley.' }, { sec: '0.9', time: '4s', force: '1 Battleship + 2 Cruisers', outcome: 'Quick destruction. Alpha-strike kills possible on soft targets.' }, { sec: '0.8', time: '5s', force: '1 Battleship + 1 Cruiser', outcome: 'Brief window for damage. Tanky ships can survive one cycle.' }, { sec: '0.7', time: '8s', force: '2 Cruisers', outcome: 'Meaningful attack window. Destroyers can kill frigates before CONCORD arrives.' }, { sec: '0.6', time: '12s', force: '1 Cruiser', outcome: 'Extended window. Cruiser can kill a mining barge before response.' }, { sec: '0.5', time: '15s', force: '2 Frigates', outcome: 'Longest high-sec response. Organized ganks are viable. The cost equation shifts toward attackers.' }, { sec: '≤0.4', time: '∞ (no response)', force: 'None', outcome: 'No CONCORD. Gate/station guns fire in 0.1–0.4. Nothing in ≤0.0.' }, ].map((row, i) => ( ))}
System SecResponse TimeCONCORD ForceOutcome
= 0.5 ? 'var(--green)' : parseFloat(row.sec) >= 0 ? 'var(--accent)' : 'var(--red)' }}>{row.sec} {row.time} {row.force} {row.outcome}

How CONCORD Works

1. Aggression — Player A attacks Player B in high-sec. combat_flag set to criminal.
2. CONCORD Spawn — Server spawns CONCORD NPCs at attacker's location. Response time based on system sec.
3. Point + Web — CONCORD warp-scrambles and stasis-webs the attacker. No escape.
4. Destruction — CONCORD applies overwhelming damage. Ship destroyed. No survival possible.
5. Status Penalty — Attacker's security status reduced. Large bounty placed automatically at low status.
6. Kill Log — Event logged in kill feed. Galaxy-wide notification if bounty collected.

Anti-Exploit Rules

  • CONCORD cannot be avoided, tanked, or outrun — response is guaranteed
  • Warping away delays CONCORD by ≤2s; they follow and catch up
  • CONCORD damage scales to always exceed attacker's EHP (no tanking)
  • If a player exploits a bug to avoid CONCORD, server admin can force-destroy the ship
  • "Criminal" flag persists through session — logging out doesn't clear it

Suspect vs. Criminal

  • Suspect — stole loot from another player's wreck. Anyone can attack the suspect freely. No CONCORD response for attacking a suspect. 15-minute timer.
  • Criminal — attacked an innocent in high-sec. CONCORD responds. Ship will be destroyed. Security status penalty applied. 15-minute weapons timer.
  • Weapons Timer — 60s after any aggressive module activation. Cannot dock, gate-jump, or tether during timer. Prevents "dock games."
Design intent: High-sec is not safe — it is punitively expensive to attack there. The gank-vs-cost equation is the core balance lever. If ganking becomes too easy, reduce CONCORD response time. If high-sec is too safe, increase response time slightly or reduce CONCORD force. The goal is a living ecosystem where piracy exists but is a strategic choice, not a griefing tool.
)} {/* ═══ INSURANCE ═══ */} {activeTab === 'insurance' && (<>
GP-INS

Ship Insurance

Insurance is both an ISK sink (premiums) and an ISK faucet (payouts). It cushions ship loss without eliminating risk. A fully insured ship still costs the player money to replace — modules, cargo, and the deductible are never covered. Insurance makes the game playable for casual players while keeping ship loss meaningful for everyone.

Coverage Tiers

{[ { tier: 'None', premium: 'Free', payout: '0%', duration: '—', best: 'Rookie frigates (free replacement anyway)' }, { tier: 'Basic', premium: '10% of hull value', payout: '40%', duration: '30 days', best: "Cheap ships you don't care about" }, { tier: 'Standard', premium: '25% of hull value', payout: '70%', duration: '30 days', best: 'Default choice for most ships' }, { tier: 'Platinum', premium: '50% of hull value', payout: '95%', duration: '30 days', best: 'Expensive ships, PvP main combat ships, mission runners' }, ].map((row, i) => ( ))}
TierPremiumPayout (% of hull value)DurationBest For
{row.tier} {row.premium} {row.payout} {row.duration} {row.best}

How Insurance Works

1. Player buys insurance at station (deducted from wallet)
2. Policy active for 30 days or until ship is destroyed
3. On ship destruction, payout queued (30–120s delay via insurance_payout agent)
4. Payout = hull value × coverage %
5. ISK deposited to player wallet
6. Policy consumed — must re-insure new ship

What Insurance Does NOT Cover

  • Fitted modules (separate loss — 50% destroyed, 50% loot)
  • Cargo (destroyed or looted — separate system)
  • AI crew injuries / medical costs
  • Rig slots (permanently destroyed on ship loss)
  • Market value above base hull price

Economic Balance

Insurance as ISK Faucet/Sink

ISK sink: Premium payments leave the economy (25% of hull value for Standard = net ISK destruction)
ISK faucet: Payouts inject ISK (70% of hull value for Standard = net ISK creation when ship is destroyed)
Net effect: At Standard tier, each ship loss creates ISK equal to 70% − 25% = 45% of hull value. This is the "cost of dying" net ISK injection. Balanced by: ship replacement costs (minerals), module losses, and the fact that hulls are manufactured from player-mined resources (zero ISK creation).
Delay purpose: The 30–120s payout delay prevents instant-rebuy combat loops. You can't die, collect insurance, and re-ship in the same fight.
Anti-abuse: Self-destructing a ship for insurance payout is an exploit. Insurance payout never exceeds premium paid unless the ship was destroyed by a different player. NPC kills pay full insurance. Self-destruct pays 0%. Alt-character kills are tracked via IP/connection heuristics and flagged for review (bounty system uses the same check). For MVP: if killer and victim are the same player, payout = 0.
GP-INS-DB

Backend Impact

New Tables & Reducers

insurance_policiespolicy_id, player_id, ship_id, tier, premium_paid, payout_value, purchased_at, expires_at, active (bool)
ship_type_base_valuesship_type_id, base_hull_value (ISK), insurance_premium_mult (per tier)
New reducer: purchase_insurance(ship_id, tier) — validate docked + wallet, deduct premium, create policy
New reducer: process_insurance_payout(ship_id) — called by insurance_payout agent, validate policy active + ship destroyed, credit ISK
)} {/* ═══ MISSIONS ═══ */} {activeTab === 'missions' && (<>
GP-MIS

Mission System

Missions are a core ISK faucet and the primary PvE progression path. NPC agents at stations offer missions that send players on scripted encounters — kill pirates, haul cargo, mine specific ores, survey anomalies, or escort convoys. Missions scale with security band, player standing, and skill level. They are repeatable but not grindable: each agent has a limited pool that refreshes on a timer. The mission system is the "guided content" that teaches new players the game loop and gives veteran players a reliable ISK income alongside market trading and PvP.

Mission Types

⚔ Kill Mission

Warp to a deadspace pocket and destroy NPC hostiles. Difficulty scales with agent tier and system security. May include multiple waves, a boss NPC, or structure destruction. The bread-and-butter of PvE combat.

Reward: Bounty + mission bonus · Time limit: 24h · Standing: +0.05 to +0.30 per completion

📦 Courier Mission

Transport goods from one station to another. Cargo may be large (requiring a hauler) or valuable (attracting pirates). Low-sec courier missions pay more. Creates organic hauler traffic that pirates can hunt.

Reward: Flat fee + time bonus · Time limit: 1–6h · Standing: +0.03 to +0.15 · Risk: low-sec route = ambush

⛏ Mining Mission

Mine a specific quantity of a specific ore type and deliver it to the agent. May require traveling to a mission-only asteroid belt (deadspace). Sometimes includes NPC spawns in the belt for added risk.

Reward: ISK + ore market value · Time limit: 24h · Standing: +0.03 to +0.10 · Dual income: sell excess ore

📡 Survey / Exploration Mission

Travel to a specific system or anomaly and scan/interact with objects. May involve hacking, analyzing, or simply being at a location for a duration. Low combat risk, high travel time. Good for exploring the galaxy.

Reward: Flat fee + loot from sites · Time limit: 6–24h · Standing: +0.02 to +0.10 · Unlocks exploration content

🚀 Escort Mission

Protect an NPC convoy as it travels between systems. NPCs spawn ambushes along the route. The convoy must survive. Failure = no reward + standing loss. Success = high reward + standing bonus. Group content (post-MVP).

Reward: High ISK + faction items · Time limit: 1–2h · Standing: +0.10 to +0.30 · Group recommended

🔄 Trade Mission

Buy a specific commodity at market price and deliver it to the agent. The agent reimburses cost + bonus. Risk: market price may have moved since you accepted. Teaches market awareness and trade route planning.

Reward: Reimbursement + 10–30% bonus · Time limit: 2–6h · Standing: +0.02 to +0.08 · Market risk

NPC Agent Interaction

Every station has 1–3 NPC agents. Agents are persistent characters with names, factions, and specialties. A player's relationship with each agent is tracked via standing — a value from −10.0 to +10.0 that determines what missions the agent offers and what rewards they give. Higher standing unlocks harder missions with better payouts.

Agent Interaction Flow

1. Dock at station — Agent Panel shows available agents at this station (with name, faction icon, standing, available missions count)
2. Select agent — Agent portrait + dialogue box. Agent greets based on standing level (hostile/neutral/friendly/loyal). Lists available missions.
3. Browse missions — Each mission shows: type, brief description, reward estimate, location hint, time limit, difficulty tier. Player picks one.
4. Accept mission — Mission added to active journal. Waypoint auto-created in navigation. Objective markers appear on overview and map.
5. Complete objectives — Kill targets, deliver cargo, mine ore, scan sites. Journal tracks progress (0/5 pirates killed, etc.).
6. Turn in — Return to agent (or any agent of same faction for courier). Reward paid. Standing updated. New mission unlocked.r/> Fail: Time expires or objective becomes impossible → standing loss (−0.05 to −0.50). Can be declined before accepting with no penalty.

Standing Mechanics

{[ { range: '−10.0 → −2.0', attitude: 'Hostile', access: 'None — agent refuses to talk', reward: 'N/A' }, { range: '−2.0 → +1.0', attitude: 'Neutral', access: 'Level 1 missions only (easy)', reward: 'Base reward ×0.8' }, { range: '+1.0 → +3.0', attitude: 'Friendly', access: 'Level 1–2 missions', reward: 'Base reward ×1.0' }, { range: '+3.0 → +6.0', attitude: 'Trusted', access: 'Level 1–3 missions (medium)', reward: 'Base reward ×1.2' }, { range: '+6.0 → +8.0', attitude: 'Loyal', access: 'Level 1–4 missions (hard)', reward: 'Base reward ×1.5 + rare loot' }, { range: '+8.0 → +10.0', attitude: 'Inner Circle', access: 'All levels + exclusive storyline arc', reward: 'Base reward ×2.0 + unique items + COSMOS missions' }, ].map((row, i) => ( ))}
Standing RangeAgent AttitudeMission AccessReward Modifier
{row.range} {row.attitude} {row.access} {row.reward}

Gaining Standing

  • Complete missions: +0.05 to +0.30 per mission (scaled by difficulty)
  • Faction-wide: completing a mission for Agent A improves standing with Agent B of the same faction (at 50% rate)
  • Storyline missions: every 16 missions of the same level triggers a storyline mission with large standing boost (+1.0 to +3.0)
  • Derived standing: faction standing affects all agents in that faction. corp standing is agent-specific.

Losing Standing

  • Fail a mission: −0.05 to −0.50 (scaled by mission level)
  • Decline 2+ missions from same agent in 4h: −0.02 per decline after the first
  • Attack NPC of a faction: −0.10 to −1.0 (scaled by NPC importance)
  • Fail storyline mission: −1.0 to −3.0 (harsh penalty)
  • Standing decays toward 0.0 at 1% per day (prevents permanent locks)

Reward Scaling

{[ { level: '1', reward: '5,000 – 15,000 ₢', bonus: '+20% if <30 min', lp: '50–150', skill: 'None', sec: 'High-sec' }, { level: '2', reward: '15,000 – 40,000 ₢', bonus: '+25% if <45 min', lp: '150–400', skill: 'Industry II or Gunnery II', sec: 'High/Low' }, { level: '3', reward: '40,000 – 100,000 ₢', bonus: '+30% if <60 min', lp: '400–1,000', skill: 'Industry III or Gunnery III', sec: 'Low/Null' }, { level: '4', reward: '100,000 – 300,000 ₢', bonus: '+35% if <90 min', lp: '1,000–3,000', skill: 'Industry IV or Gunnery IV + ship class skill', sec: 'Null/Deep' }, ].map((row, i) => ( ))}
LevelBase RewardTime BonusLoyalty PointsSkill Req.Security Band
Level {row.level} {row.reward} {row.bonus} {row.lp} {row.skill} {row.sec}
Loyalty Points (LP): Completing missions earns LP with the agent's faction. LP can be spent at faction stations for faction-specific items (modules, ships, BPCs) at below-market prices. This creates a secondary currency that rewards mission runners and cannot be traded between players. LP stores are faction-specific — Caldari LP can't be spent at Gallente stations.
GP-MIS-DB

Backend Impact

New Tables, Reducers & Agent Updates

npc_agentsagent_id, name, faction_id, station_id, specialty (kill/courier/mining/survey/trade/escort), quality (u32), mission_levels_offered, dialogue_seed
mission_templatestemplate_id, type (enum), level (1–4), title, description_template, objectives_json, reward_base, time_limit_seconds, security_band_min, skill_requirements_json, faction_id
active_missionsmission_id, player_id, agent_id, template_id, objectives_state_json, status (active/completed/failed/expired), accepted_at, expires_at, completed_at
player_standingplayer_id, entity_id (agent or faction), entity_type (agent/faction), standing (f64, −10 to +10), last_mission_at
player_loyalty_pointsplayer_id, faction_id, lp_balance (u64), lifetime_earned (u64)
mission_offersoffer_id, agent_id, station_id, template_id, reward_modifier, expires_at, generated_at

Reducers: accept_mission(offer_id), complete_mission_objective(mission_id, objective_idx), turn_in_mission(mission_id), decline_mission(offer_id), fail_mission(mission_id)
Agent update: npc_mission_refresh (existing, 1800s) — generates 2–5 new offers per agent from template pool, weighted by faction state, player activity, and standing. Removes expired offers.
Mission journal UI: A docked-only panel showing all active missions with objective progress, time remaining, reward estimate, and a "set waypoint" button. In Flight Mode, active mission objectives appear as HUD indicators (e.g., "Pirates remaining: 3/5" in the top-right corner). Mission completion triggers a notification toast.
)} {/* ═══ TRAVEL & WARP ═══ */} {activeTab === 'travel' && (<>
GP-TRAVEL

Travel & Warp Mechanics

Click to autopilot — the player sets intent, the ship executes. There is no manual flight control. The player clicks a destination (asteroid, station, stargate, bookmark, or any point in space) and the ship navigates there. Travel has three modes: sub-warp (slow, in-system), warp (fast, in-system), and gate jump (instant, inter-system). Each mode has different speed, acceleration, and interaction rules. Travel time is the primary "geography tax" that makes distant systems feel distant and creates real trade route logistics.

Travel Modes

{[ { mode: 'Sub-Warp', speed: '150–300 m/s (ship speed stat)', use: 'Approach objects within 500km. Orbiting, mining range, docking approach.', input: 'Click target → “Approach.” Ship moves at base speed.' }, { mode: 'Warp', speed: '3.0–6.0 AU/s (ship class dependent)', use: 'Travel within a system. Warp to station, belt, gate, bookmark, or any celestials.', input: 'Click target → “Warp To.” Ship aligns, then enters warp.' }, { mode: 'Gate Jump', speed: 'Instant', use: 'Travel between star systems. Jump through a stargate to the paired gate in the destination system.', input: 'Click stargate → “Jump.” Must be within 2,500m of gate.' }, ].map((row, i) => ( ))}
ModeSpeedUse CasePlayer Input
{row.mode} {row.speed} {row.use} {row.input}

Warp Mechanics — Detailed

Warp Sequence

1. Align: Ship turns toward destination. Align time = 2–8s by ship class (frigate fastest, battleship slowest).
2. Accelerate: Ship reaches 75% of max speed while aligned. ~1s for frigates, ~3s for battleships.
3. Enter Warp: Ship enters warp tunnel. Speed ramps from 0 to max warp speed over 2s.
4. Cruise: Ship travels at warp speed (3–6 AU/s). Deceleration starts at 50% of remaining distance.
5. Exit Warp: Ship decelerates from warp speed to 0 over 2s. Appears 0–50km from destination.

Warp Speed by Ship Class

{[ { cls: 'Frigate', warp: '6.0 AU/s', align: '2s', cross: '~7s' }, { cls: 'Destroyer', warp: '5.0 AU/s', align: '3s', cross: '~9s' }, { cls: 'Cruiser', warp: '4.5 AU/s', align: '4s', cross: '~11s' }, { cls: 'Battlecruiser', warp: '3.5 AU/s', align: '6s', cross: '~14s' }, { cls: 'Battleship', warp: '3.0 AU/s', align: '8s', cross: '~18s' }, ].map((r, i) => ( ))}
ClassWarp SpeedAlign TimeSystem Cross (30 AU)
{r.cls} {r.warp} {r.align} {r.cross}
Warp disruption: A warp scrambler module (medium slot, combat module) prevents the target ship from entering warp while the scrambler is active and the target is within scram range (10km). If a ship is scrambled while aligning, the warp is cancelled. If scrambled during warp exit, the next warp is blocked. This is the primary PvP tackle mechanic. NPCs do not use warp scramblers in MVP (Phase 3+ only).

Stargate Mechanics

Gate Jump Sequence

1. Warp to stargate (arrive 0–20km from gate)
2. Sub-warp approach to within 2,500m (activation range)
3. Click "Jump" — ship activates gate
4. Jump delay: 5s (global cooldown per character, prevents rapid gate-hopping)
5. Ship appears at paired gate in destination system
6. Gate cloak: 30s invulnerability after jump (ship is invisible to other players, cannot be targeted, cannot activate modules). Breaks early if you move or activate anything.
7. Player must warp away from gate before cloak expires or risk being targeted

Gate Guns & Security

  • High-sec gates: No gate guns needed — CONCORD handles aggression.
  • Low-sec gates (+0.1 to +0.4): Gate guns fire on any aggressor within 150km. Moderate damage — can be tanked by battlecruiser+ for a short time. Guns do not prevent aggression, they punish it.
  • Null-sec gates (0.0 and below): No gate guns. No rules. Anything goes. Gate camps are a primary PvP activity.
  • Weapons timer: 60s after any aggressive module activation. Cannot jump gates during weapons timer. Prevents "shoot and jump" tactics ("gate games").

Docking & Undocking

Docking

1. Warp to station (arrive 0–20km)
2. Approach to within 500m (docking range)
3. Click "Dock"
4. Docking is instant — ship disappears from space, player enters Station Mode
5. Cannot dock while weapons timer is active (60s after aggressive action)

Undocking

1. Click "Undock" in Station Mode
2. Ship appears outside station, moving at base speed away from station
3. Undock invulnerability: 20s. Cannot be targeted. Cannot activate modules. Breaks if you change direction or activate anything.
4. Player has 20s to assess the situation and warp to a safe location
5. No "station games" — you always get a safe undock window

Autopilot & Route Planning

Autopilot flies the route automatically, but at a cost. Players can set a multi-system route (via waypoints) and activate autopilot. The ship will warp to each gate, jump, warp to the next gate, and repeat. Autopilot is slower than manual piloting: it warps to 15km from each gate instead of 0km, requiring a sub-warp approach each time. Manual pilots who click precisely arrive faster. Autopilot is a convenience, not a replacement for active play.

Manual Warp

  • Click gate → "Warp To 0m" → arrive on grid
  • Jump immediately (within activation range)
  • Fastest possible travel
  • Requires active player attention at each gate

Autopilot

  • Set route → activate autopilot
  • Warps to 15km from each gate, approaches, jumps
  • ~30% slower than manual (extra approach time per gate)
  • Vulnerable during gate approach (PvP risk in low/null)
  • Can be cancelled at any time by clicking anywhere
GP-TRAVEL-DB

Backend Impact

Travel-Related State & Reducers

ships — add column: travel_mode (enum: idle / aligning / in_warp / gate_jump / sub_warp_approach / docked)
ships — add column: gate_cloak_until (timestamp, null when not cloaked). 30s after gate jump.
ships — add column: undock_invuln_until (timestamp, null when not active). 20s after undock.
ships — add column: weapons_timer_until (timestamp, null when not active). 60s after aggressive action.
ships — add column: jump_cooldown_until (timestamp). 5s global per character after gate jump.

New reducer: warp_to(ship_id, target_system_entity_id, distance_km) — validate not scrambled, begin align sequence.
New reducer: jump_gate(ship_id, gate_id) — validate within 2,500m, validate no weapons timer, validate cooldown expired, execute jump.
New reducer: dock(ship_id, station_id) — validate within 500m, validate no weapons timer, set docked.
New reducer: undock(ship_id) — validate docked, place ship outside station, set 20s invulnerability.
New reducer: set_autopilot(ship_id, route_id) — begin automated route following.
New reducer: cancel_autopilot(ship_id) — stop route following, resume idle.
)} {/* ═══ WORLD EVENTS UX ═══ */} {activeTab === 'events' && (<>
GP-EVT

World Event Player UX

The player needs to see, understand, and act on world events without leaving their current activity. The backend pipeline (spawn → propagate → resolve → story log) is fully specified in the Dynamic Galaxy tab. This tab specifies the player-facing surface: how events appear, what information is shown, and how players interact with events in both Flight Mode and Station Mode.

Event Notification Tiers

Not all events are equally urgent. The notification system uses three tiers that determine how aggressively the player is interrupted:

{[ { tier: '⚡ Critical', trigger: 'Event in current system, player directly affected', flight: 'HUD alert flash + audio ping + top-center banner. Pause-safe: combat continues but banner demands attention. Banner auto-dismisses after 10s or on click.', station: 'Modal dialog with event details + action buttons ("Warp to site"). Market panel may show price impact callout.', examples: 'Supernova warning, pirate raid on your station, faction invasion of your home system' }, { tier: '📍 Nearby', trigger: 'Event in adjacent system or current region', flight: 'Side panel notification (slides in from right). No audio. Click to expand details. Dismisses when event resolves or player leaves region.', station: 'News feed sidebar item. Glowing dot on region map. Agent dialogue may reference it.', examples: 'Anomaly detected 2 jumps away, convoy departing nearby station, faction skirmish in adjacent constellation' }, { tier: '📰 Background', trigger: 'Event anywhere in galaxy, not in player region', flight: 'Chat-style ticker in bottom-left corner. No interruption. Logged in story journal for later review.', station: 'Galaxy News tab in station UI. Story log entry. Price impact shown in market history charts.', examples: 'Distant faction war, migration route shift, station construction completed, cosmic catastrophe aftermath' }, ].map((row, i) => ( ))}
TierTriggerFlight ModeStation ModeExamples
{row.tier} {row.trigger} {row.flight} {row.station} {row.examples}

Event Detail Panel

Clicking on any event notification opens the Event Detail Panel — a shared component used in both Flight and Station modes. The panel shows everything the player needs to decide whether and how to participate:

Event Detail Panel Layout

Header: Event icon + name + severity gauge (1–5 bar) + countdown timer to resolution/escalation
Location: System name + region + distance in jumps + security level of target system
Narrative: 2–3 sentence in-universe description. "A Guristas raiding fleet has been spotted massing at the Ostingale gate. Local defense forces are overwhelmed."
Rewards: Participation reward tier (bronze/silver/gold based on contribution). Expected ISK + LP. Special loot possibilities.
Participants: Live count of players at the event site. "12 pilots engaged" — signals competition or cooperation opportunity.
Actions: [Warp to Site] (if in-system) / [Set Route] (if distant) / [Watch] (track without participating) / [Dismiss]
History: Collapsible log of event progression. "14:23 — First wave defeated. 14:31 — Boss spawned. 14:35 — CMDR Riker destroyed."

Event Map Integration

System Map (Era 1)

Events in the current system appear as pulsing icons at their location. Clicking an event icon on the map opens the Event Detail Panel. Active events have a glowing radius showing their area of effect. Resolved events fade to a dim marker for 5 minutes before disappearing.

Galaxy Map (Era 2)

Events across all systems appear as icons on the galaxy map, sized by severity and colored by type. A filter sidebar lets players show/hide by type (faction conflict, anomaly, migration, catastrophe). Hover shows tooltip with event name + countdown. Click opens Event Detail Panel.

Event Participation & Contribution Tracking

Contribution determines reward. Players who arrive first and contribute most get the best rewards. This is tracked server-side and is resistant to AFK exploitation.

Contribution Metrics

  • Damage dealt: to event NPCs (primary metric for combat events)
  • Time on-site: must be present for ≥60s to qualify (anti-AFK)
  • Logistics: remote repairs to other participants count at 80% of damage value
  • Objective completion: hacking a can, mining a special asteroid, escorting the convoy
  • Early arrival: first 5 participants get a 10% bonus (rewards information speed)

Reward Tiers

  • Bronze: Any contribution. 50% base reward. Common loot table.
  • Silver: Top 50% contributors. 100% base reward + 100 LP. Uncommon loot table.
  • Gold: Top 10% contributors. 200% base reward + 500 LP + rare loot. Name appears in story log.
  • AFK check: If no client input for 90s while on event site, contribution pauses. Must take an action (module activate, move, target) to resume.

Story Log

Galaxy Story Log — The Server's History

Access: Station Mode → Story Log tab. Also accessible from Galaxy Map sidebar.
Format: Chronological timeline of all events, filterable by region/type/era. Each entry has headline + body + timestamp + participants list.
Personal history: A separate filter shows "Events I participated in" — the player's personal saga.
Persistence: Story log is permanent. Even years later, a player can look back at "the Battle of Jita" and see the full narrative.
Search: Full-text search across all entries. "What happened in Pure Blind last week?" → search results with highlighted entries.
Export: Copy link to any story log entry for sharing in chat. "Did you see [this]?" with a clickable link to the event.
Design intent: The event UX must feel like news, not like a quest log. Players should discover events naturally — through sensor alerts, chat rumors, price changes, or map icons — not through a mandatory event panel. The notification system provides awareness; the detail panel provides information; the decision to participate is always the player's choice. The best stories are the ones players tell each other: "You should have been at Jita yesterday — there was a massive Guristas raid and I scored a faction BPC from the gold tier."
)} {/* ═══ BALANCING AGENT ═══ */} {activeTab === 'balancer' && (<>
GP-BAL

Balancing Agent — Adaptive Economy & PvE Control

This is at heart a PvE game. The environment has hostile elements — NPC pirates, faction raids, anomalies — that challenge players and drain resources. But a static PvE difficulty can't adapt to a changing player population or economy. The Balancing Agent is an automated system (similar to the world event agent) that monitors key economic and gameplay metrics and adjusts hostile encounter rates, ISK faucet rates, and difficulty to keep the game within healthy parameters. It is the invisible hand that keeps the galaxy challenging but fair.

Metrics Monitored

MetricSourceHealthy RangeTick Interval
ISK Velocity Total ISK earned per player-hour (faucets) 2,000–8,000 \u2262/hr 15 min
Price Index Weighted basket of commodity prices vs. baseline 0.85–1.15 (inflation-adjusted) 30 min
Player Death Rate Ship destructions per active player per hour 0.1–0.5 deaths/hr 10 min
Faucet/Sink Ratio Total ISK created vs. destroyed per tick 0.95–1.05 (near balance) 30 min
Player Engagement Active players / total registered players > 40% 60 min

Control Levers

NPC Spawn Rate Multiplier

Adjusts the base spawn rate of NPC pirates across all security bands. If ISK velocity is too high (players are earning too fast), spawn rate increases to create more danger and ship losses. If players are dying too much, spawn rate decreases to ease pressure.

Range: 0.5\u00d7–2.0\u00d7 · Applied per security band · Smooth transition (10% per tick)

NPC Difficulty Tier

Shifts the NPC class distribution within each security band. Higher difficulty means more cruisers in low-sec instead of frigates. This affects bounty payouts (ISK faucet) and ship destruction rates (ISK sink via insurance).

Range: \u22121 tier to +1 tier from baseline · Applied per region · Shifts over 6 ticks

ISK Faucet Multiplier

Directly scales all ISK faucets: NPC bounties, mission rewards, insurance payouts. Used as a last resort when spawn rate and difficulty aren't enough. If the price index shows deflation (players can't afford ships), faucet multiplier increases. If inflating, it decreases.

Range: 0.8\u00d7–1.2\u00d7 · Applied globally · Changed max once per 24h

World Event Frequency

Controls how often world events spawn. More events = more ISK entering the economy (event rewards) and more engagement. Fewer events = calmer galaxy. Tied to engagement metric — if players are logging off, event frequency increases to create excitement.

Range: 0.5\u00d7–1.5\u00d7 spawn weight · Applied per event type · Updated hourly

Agent Behavior

Balancing Agent Tick Pipeline

1. Collect metrics — query ISK velocity, price index, death rate, faucet/sink ratio from SpacetimeDB aggregation tables
2. Compare to thresholds — each metric has a healthy range; deviations trigger adjustment signals
3. Weighted decision — adjustments are weighted: spawn rate (40%), difficulty (30%), faucet multiplier (20%), events (10%)
4. Smooth application — changes apply gradually (10% per tick toward target) to avoid jarring player experience
5. Safety clamp — all multipliers clamped to their ranges. If multiple metrics conflict, death rate takes priority (don't kill the newbies)
6. Log intervention — every adjustment is logged in a balance_audit table for developer review. No silent changes.
Visibility to players: The Balancing Agent is invisible by default. Players should never feel "the game is adjusting difficulty." However, observant players may notice that NPC spawns increase after a quiet period or that bounties are slightly lower during a gold rush. Zora may comment on market conditions ("NPC activity has been high in this region lately") without revealing the underlying mechanism. The agent is a safety net, not a theme park ride.
GP-BAL-DB

Backend Impact

New Tables & Agent

balance_metricsmetric_name, current_value, healthy_min, healthy_max, last_updated, trend (rising/falling/stable)
balance_leverslever_name, current_multiplier, target_multiplier, clamp_min, clamp_max, last_adjusted_at
balance_auditaudit_id, tick_time, metrics_snapshot_json, adjustments_json, reason

New agent: balancing_tick (fixed interval, 900s) — collects metrics, evaluates thresholds, adjusts levers, logs audit entry
)}
); } window.GDD.GameplayPage = GameplayPage;