window.GDD = window.GDD || {}; function EconomyPage() { const [activeSection, setActiveSection] = React.useState('overview'); const refiningTable = [ { ore: 'Veldspar', mineral: 'Tritanium', yield: 415, batch: 333, time: '45s' }, { ore: 'Scordite', mineral: 'Pyerite', yield: 171, batch: 333, time: '45s' }, { ore: 'Pyroxeres', mineral: 'Nocxium', yield: 8, batch: 333, time: '60s' }, { ore: 'Kernite', mineral: 'Isogen', yield: 107, batch: 200, time: '60s' }, { ore: 'Omber', mineral: 'Isogen', yield: 86, batch: 500, time: '75s' }, { ore: 'Jaspet', mineral: 'Zydrine', yield: 8, batch: 500, time: '75s' }, { ore: 'Hemorphite', mineral: 'Nocxium', yield: 21, batch: 500, time: '90s' }, { ore: 'Arkonor', mineral: 'Megacyte', yield: 18, batch: 200, time: '120s' }, ]; const manufacturingRecipes = [ { product: 'Mining Laser I', minerals: 'Tritanium ×200, Pyerite ×80', time: '5m', station: 'Any', skill: 'Industry I' }, { product: '150mm Railgun', minerals: 'Tritanium ×400, Pyerite ×150, Nocxium ×20', time: '15m', station: 'Any', skill: 'Industry II' }, { product: 'Shield Booster I', minerals: 'Tritanium ×300, Isogen ×50', time: '10m', station: 'Any', skill: 'Industry II' }, { product: 'Frigate Hull', minerals: 'Tritanium ×2000, Pyerite ×800, Nocxium ×100', time: '30m', station: 'Factory', skill: 'Industry III' }, { product: 'Cruiser Hull', minerals: 'Tritanium ×8000, Pyerite ×3000, Isogen ×500, Nocxium ×200', time: '2h', station: 'Factory', skill: 'Industry IV' }, { product: '1MN Afterburner', minerals: 'Tritanium ×150, Pyerite ×50, Isogen ×20', time: '8m', station: 'Any', skill: 'Industry II' }, ]; const faucetsAndSinks = [ { type: 'faucet', name: 'NPC Buy Orders', description: 'Station NPCs buy basic ores at floor prices. Guarantees new players can always earn ISK.', rate: '~2,000 ISK/min for rookie miner' }, { type: 'faucet', name: 'Insurance Payout', description: 'Ship destruction triggers insurance payout (30–120s delay). Tier-dependent: 40–95% of hull value. See Gameplay → Insurance tab.', rate: 'Varies by ship value and tier' }, { type: 'faucet', name: 'Mission Rewards', description: 'NPC agents pay ISK for completed missions. Scaling rewards based on mission tier and standing. See Gameplay → Missions tab.', rate: '~5,000–300,000 ₢ per mission (level 1–4)' }, { type: 'faucet', name: 'Bounty Prizes', description: 'NPC pirates drop bounty ISK when destroyed. Higher in low-sec space.', rate: '~1,000–20,000 ISK per kill' }, { type: 'faucet', name: 'Loyalty Point Store', description: 'Mission LP can be exchanged for faction items at below-market prices, creating indirect ISK value. See Gameplay → Missions tab.', rate: '~500 LP per mission, redeemable for items worth 1–50₢/LP' }, { type: 'sink', name: 'Market Tax', description: '2% tax on all market transactions. Higher in NPC stations, lower in player stations (post-MVP).', rate: '2% of transaction value' }, { type: 'sink', name: 'Manufacturing Fees', description: 'Station takes a cut of mineral value as a manufacturing fee.', rate: '1–5% of output value' }, { type: 'sink', name: 'Ship Purchase', description: 'Buying ships and modules from market or manufacturing. Largest single sink.', rate: 'Variable' }, { type: 'sink', name: 'Insurance Premiums', description: 'Players pay 10–50% of hull value for insurance coverage. See Gameplay → Insurance tab.', rate: '10–50% of hull value per 30-day policy' }, { type: 'sink', name: 'Blueprint Research', description: 'ME/TE research costs ISK and time. See Economy → Manufacturing tab.', rate: '50,000–5,000,000 ₢ per research level' }, { type: 'sink', name: 'Crew Wages', description: 'AI crew members require wage payments. Higher rank = higher cost. (Post-MVP)', rate: '~500–5,000 ISK/cycle' }, ]; return (

Economy & Industry

Player-led economy with NPC support as an underlying demand/supply buffer. Players mine, refine, manufacture, and trade. NPCs provide a price floor and basic market liquidity so new players always have a way to earn and spend.

Player-led
Economy Model
8 → 8
Ore Types → Minerals
8+
Manufacturable Items
2%
Market Tax
{/* Tab navigation */}
{[ { id: 'overview', label: 'Flow Overview' }, { id: 'first30', label: '🚀 First 30 Minutes' }, { id: 'diffusion', label: '📡 Info Diffusion' }, { id: 'refining', label: 'Refining' }, { id: 'manufacturing', label: 'Manufacturing' }, { id: 'npc-pricing', label: '💹 NPC Pricing' }, { id: 'faucets', label: 'Faucets & Sinks' }, ].map(t => ( ))}
{/* FIRST 30 MINUTES */} {activeSection === 'first30' && ( <>
ECON-30

First 30 Minutes of Economy

Exploration and commerce are the core pillars. This walkthrough shows what a new player sees, decides, and experiences in their first 30 minutes — from undocking with an empty cargo hold to discovering their first price difference and making a profitable trade. The goal: by minute 30, the player understands that information asymmetry is the game, and they've profited from it at least once.
{[ { time: '0:00', title: 'Spawn at Home Station', desc: 'Player connects to SpacetimeDB, spawns in a rookie frigate at their home station. Station Mode UI is active: Market Panel, Inventory, Fitting Screen, and Agent Panel are visible in the sidebar. Wallet shows 0 ISK.', color: 'var(--cyan)' }, { time: '0:30', title: 'First NPC Agent Mission', desc: 'The Agent Panel glows with an available mission. Player talks to Agent — "Welcome, pilot. I need 500 units of Veldspar delivered to this station. I\'ll pay 1,500 ISK." Accept mission. Objective marker appears on System Map.', color: 'var(--green)' }, { time: '1:00', title: 'Undock into Flight Mode', desc: '3D viewport fades in. Ship floats near the station. Asteroid belts visible as icons in the overview panel. Target the nearest belt and click "Warp To". Ship enters warp.', color: 'var(--accent)' }, { time: '2:00', title: 'Mining Cycle', desc: 'Arrive at belt. Three asteroids in view. Target a Veldspar asteroid, click "Mine". Ship approaches automatically. Mining laser activates — progress bar fills. Cargo counter ticks up: 0/150, 10/150, 25/150... The mining laser hums. Zora chirps: "Cargo at 33%."', color: 'var(--purple)' }, { time: '5:00', title: 'Cargo Full — Return to Station', desc: 'Cargo hits 150/150 units. HUD flashes "CARGO FULL". Player warps back to station. Docks. Station Mode transitions in. Inventory shows 150 Veldspar.', color: 'var(--cyan)' }, { time: '6:00', title: 'First Sale — The NPC Price', desc: 'Open Market Panel. Veldspar shows: NPC Buy Price = 2.50\u2262/unit. Sell 150 units → wallet shows 375 ISK. Not enough for a module. Zora notes: "You could earn more if you refine first — your Industry skill gives 60% yield."', color: 'var(--green)' }, { time: '8:00', title: 'The Discovery — Second Station Prices', desc: 'Player warps to a second station in the same system (or an adjacent system). Opens Market Panel. Veldspar NPC Buy Price here = 3.10\u2262/unit. That\'s 24% more. The price is different! This is the aha moment — geography matters.', color: 'var(--red)' }, { time: '10:00', title: 'The Decision', desc: 'Mine more Veldspar at the nearby belt. Cargo fills to 150 again. Two choices visible: (A) Sell at Station 1 for 2.50\u2262 = 375 ISK, or (B) Fly to Station 2 and sell for 3.10\u2262 = 465 ISK. Option B earns 90 ISK more — but takes 2 minutes of travel time. Is it worth it?', color: 'var(--accent)' }, { time: '12:00', title: 'Executing the Trade Route', desc: 'Player chooses Station 2. Warps there, docks, sells. Wallet: 840 ISK. They notice the Market Panel also shows Scordite at 5.20\u2262 here vs. 4.00\u2262 at Station 1. A second price gap. The loop beckons.', color: 'var(--cyan)' }, { time: '15:00', title: 'Agent Mission Turn-In', desc: 'Return to home station. Turn in the 500 Veldspar mission (already over-delivered). Agent pays 1,500 ISK + 50 LP. Wallet: 2,340 ISK + 150 units excess ore. Standing +0.10 with agent.', color: 'var(--green)' }, { time: '18:00', title: 'First Refining Decision', desc: 'Refining tab shows: 200 Veldspar at 60% yield = 249 Tritanium (worth ~797\u2262 vs. raw ore at 500\u2262). Refine. Minerals appear in hangar. The production chain becomes visible.', color: 'var(--purple)' }, { time: '22:00', title: 'Zora Flags an Opportunity', desc: 'Zora\'s market module fires: "I\'ve tracked your trades. Veldspar prices at Station 2 have been above average for 3 cycles. This looks like sustained demand — possibly a manufacturing cluster buying raw materials. I\'d recommend filling your cargo before heading there next time."', color: 'var(--accent)' }, { time: '25:00', title: 'Manufacturing Tab Peek', desc: 'Player opens Manufacturing tab. Mining Laser I requires: 200 Tritanium + 80 Pyerite (which they partially have). The blueprint shows a 5-minute job. They\'re 40 Pyerite short. They know Scordite refines to Pyerite. A new mining target appears.', color: 'var(--cyan)' }, { time: '30:00', title: 'The Loop Is Set', desc: 'Player has 2,340 ISK, 249 Tritanium, a standing relationship with an NPC agent, and two known price differences between stations. They understand: mine → choose where to sell → reinvest → manufacture. The economy is no longer abstract — it\'s a map of opportunities they can see and act on.', color: 'var(--green)' }, ].map((step, i) => (
{i < 13 &&
}
MIN {step.time}

{step.title}

{step.desc}

))}
Design intent: By minute 8, the player has discovered that prices differ between stations. By minute 12, they\'ve acted on that discovery and profited. By minute 30, they have a mental model of the economy as a landscape of opportunities, not a single "sell" button. This is the hook. If the price discovery moment doesn\'t feel exciting, the entire game falls flat.
)} {/* DIFFUSION */} {activeSection === 'diffusion' && ( <>
ECON-📡

Information Diffusion Between Systems

This IS the game. In EVE Online, the richest players aren't the best pilots — they're the best informed. Information about market prices, supply disruptions, and trade opportunities propagates at the speed of player travel, not the speed of light. A player who knows that Veldspar spiked 40% in Amarr while it's still cheap in Jita has a window of opportunity that closes as other traders make the same discovery. This is the core loop of a spreadsheet simulator: information asymmetry → profitable action → market correction.

Information Propagation Model

Event occurs (belt depleted, station sold out, pirate attack) →{' '} Local chat sees it immediately →{' '} Adjacent systems learn in ~2 min →{' '} Hub markets update in ~5 min →{' '} Full region in ~15 min →{' '} Galaxy-wide in ~30 min (single galaxy propagation)

Information Channels

ChannelPropagationLatencyReliabilityExample
Local Market Instant, system-only 0s 100% — live order book You see every buy/sell order in your current station
Local Chat Instant, system-only 0s Unverified — players lie "Scordite prices are crashing in Amarr" — could be true, could be market manipulation
Ship AI Reports Aggregated, player-specific Real-time High — computed from data your ship has seen Zora says: "Veldspar is 18% below its 7-day average here. I've logged 3 similar price dips that corrected within 2 hours."
Region Market Data Delayed by jump distance 2–10 min Stale — snapshot, not live The price you see for a system 5 jumps away is from 5 minutes ago. It may have moved.
News Feed Galaxy-wide events 15–30 min Factual but delayed "Major fleet engagement in PF-346. Megacyte supply disruptions expected." Includes world events: faction wars, anomalies, migrations.
Scout Reports Manual, player-to-player Variable Trust-based A corpmate tells you they saw a Tritanium shortage in Rens. First-hand intel.

Why This Matters

Information Asymmetry = Gameplay

The player who knows a price discrepancy exists first can fill a hauler and profit. The player who arrives late finds the gap already closed. This is why speed of information matters, and why players will pay for better intel, scout networks, and fast ships for information running.

Delayed Data = Speculation

Because market data from other systems is delayed, traders must predict where prices are heading. They see a snapshot from 5 minutes ago and must decide: is the trend still moving, or has it reversed? This creates genuine risk and reward from pure information work — no combat required.

Geography = Strategy

Systems farther from trade hubs have more stale data and wider spreads. Deep null-sec markets are almost blind — the player who establishes a reliable supply chain out there controls the local economy. Distance is not just travel time; it's an information barrier.

Zora as Information Edge

The ship AI (Zora) is a force multiplier for information. She remembers every price the player has seen, spots patterns, flags anomalies, and can continue monitoring markets while the player is offline. A high-phase Zora is worth more than any single module — she's a living spreadsheet that thinks about your portfolio.

Implementation: Market Data Pipeline

SpacetimeDB — Market Diffusion Tables
// Each system has its own view of market reality
table system_market_view {'{'}
  system_id: u64,
  commodity_id: u64,
  best_bid: f64,
  best_ask: f64,
  last_trade_price: f64,
  volume_24h: u64,
  snapshot_time: timestamp,
  // ^ How stale is this data? Key field.
{'}'}

// Diffusion scheduler — propagates data between connected systems
reducer propagate_market_data(ctx) {'{'}
  // Each tick, for each system pair connected by a gate:
  // 1. Compare local prices vs neighbor's snapshot
  // 2. If snapshot_age > propagation_delay, push updated prices
  // 3. Add random noise proportional to distance from source
  // 4. Diffusion speed ~1 system per 2 minutes per jump
{'}'}
)} {/* OVERVIEW */} {activeSection === 'overview' && ( <>

Economy Pipeline

Mine Ore →{' '} Choose:
  ├─ Sell RawMarket (fast, lower price)
  └─ RefineMinerals →{' '} Choose:
      ├─ Sell MineralsMarket (higher value)
      └─ ManufactureShips/Modules →{' '} Use or Sell
ECON-PHI

Design Philosophy

Player agency first

Players set prices, build supply chains, and create market dynamics. NPC orders are a safety net, not the primary economy. The goal is emergent trade routes, regional price differences, and player-driven scarcity.

NPC as buffer

NPC buy orders create a price floor so mining is always worth something. NPC sell orders provide basic items at a premium so new players aren't stuck. As the player economy matures, NPCs step back.

Geographic trade

Different systems produce different ores. Null-sec has rarer minerals but higher risk. This creates natural trade corridors and hauler opportunities. Region matters.

Sinks balance faucets

Every ISK entering the economy must eventually leave. Ship destruction is the primary sink — it's fun, dramatic, and removes value. Taxes and fees are the steady drain. Inflation is the enemy.

ECON-MKT

Market Surface — The Primary Game Interface

The Market Panel is where players spend most of their time. It is the richest, most complex UI surface in the game. The Market demo (js/demos/market.js) validates a feature set that goes beyond the original Economy spec. This section brings the spec up to what the demo actually implements.

Order Book & Depth

Every commodity has a live order book with bid/ask spread visualization. Buy orders (bids) stack on the left, sell orders (asks) on the right. Depth chart shows cumulative volume at each price level. Players can see exactly where their order sits in the queue.

Order types: Market (instant fill), Limit (price-specified), Stop (trigger-based)

Price History & Charts

Candlestick charts with configurable timeframes (1h, 6h, 24h, 7d, 30d). Volume bars overlaid. Moving averages (7-period, 20-period). Players can annotate charts and share screenshots. Historical data is per-station, per-commodity — no galaxy-wide aggregation (information is local).

Data source: SpacetimeDB market_orders table + computed aggregations

Contract Specifications

Each commodity is traded as a contract with standardized lot sizes. Contracts specify: commodity type, lot size, tick size (minimum price increment), and settlement rules. This enables the order book to aggregate orders efficiently and provides a clean abstraction for the market engine.

Example: Tritanium contract = 1,000 units/lot, tick = 0.01₢

Margin Accounts & Positions

Era 2 feature. Players can open long and short positions on commodity contracts using a margin account. Margin requires collateral (ISK + assets). Maintenance margin enforced — if position moves against the player beyond the margin, the position is force-liquidated. This adds speculative depth for advanced traders.

Margin ratio: 20% initial, 10% maintenance · Force liquidation at 5%

Commodity Ticker

Scrolling price ticker across all active contracts. Real-time price updates filtered by player's current station or region. Category filters (Ore, Minerals, Modules, Ships). Sparkline mini-charts next to each ticker entry. The ticker runs in both Flight Mode (bottom bar) and Station Mode (market panel sidebar).

Update rate: 5s in-station, 30s regional (info diffusion applies)

Station-Filtered View

Market data is station-local by default. Players see the full order book for their current station. To see prices at other stations, they must use the Region Market Data channel (delayed, see Info Diffusion tab) or travel there physically. No global market view exists — information geography is real.

Players at trade hubs see more orders, tighter spreads, and faster updates
Priority callout: Economy feel + social/multiplayer feel are the two most important things to get right. If the economy doesn't feel rewarding and dynamic, the game falls flat regardless of how good combat or graphics are.
Currency naming: "ISK" (symbol \u2262) is a temporary placeholder. The final in-game currency name will be chosen during development. All references to ISK throughout the GDD should be understood as subject to renaming.
)} {/* REFINING */} {activeSection === 'refining' && ( <>
ECON-REF

Ore → Mineral Refining

Raw ore can be sold directly or refined into minerals at a station with reprocessing facilities. Refined minerals are worth more per m³ but require batch sizes and processing time. Refining efficiency improves with the player's Industry skill level.

{refiningTable.map((row, i) => ( ))}
Ore Yields Mineral Units per Batch Base Yield Process Time
{row.ore} {row.mineral} {row.batch} {row.yield} {row.time}

Refining Efficiency

Base efficiency: 50%
Industry I: 60%
Industry II: 70%
Industry III: 80%
Industry IV: 87.5%
Industry V: 95%
Lost material is destroyed (not recovered).

Decision: Sell Raw vs Refine?

At 50% efficiency, selling raw ore is usually better ISK/m³. At 80%+ efficiency, refining is almost always more profitable. This creates a natural skill gate: new players sell raw, veterans refine and manufacture.

Strategic choice: Do you invest XP into Industry early for better margins, or into combat skills for safer mining in low-sec?
)} {/* MANUFACTURING */} {activeSection === 'manufacturing' && ( <>
ECON-MFG

Manufacturing

Players can manufacture ships, modules, and ammunition from refined minerals. Manufacturing requires a station with factory facilities, the correct minerals, and the appropriate Industry skill level. Manufacturing time creates natural production queues and opportunity cost.

{manufacturingRecipes.map((row, i) => ( ))}
Product Mineral Cost Time Station Skill Req.
{row.product} {row.minerals} {row.time} {row.station} {row.skill}
ECON-MFG.1

Full Production Chain

Manufacturing is not one step — it's a chain. Raw ore refines into minerals. Minerals can be directly manufactured into basic modules, but advanced items require intermediate components first. This multi-stage chain creates specialization opportunities: a player who focuses on component manufacturing sells to ship builders who have never mined a single asteroid.

Production Chain Tiers

Tier 0 — Ore (mined from asteroids): Veldspar, Scordite, Pyroxeres, Kernite, Omber, Jaspet, Hemorphite, Arkonor
Tier 1 — Mineral (refined from ore): Tritanium, Pyerite, Nocxium, Isogen, Zydrine, Megacyte, Mexallon, Morphite
Tier 2 — Component (manufactured from minerals): Capacitor Unit, Shield Emitter, Armor Plate, Thruster Assembly, Electronics Cluster, Weapon Housing
Tier 3 — Module (manufactured from components + minerals): Mining Laser, Railgun, Shield Booster, Afterburner, Warp Scrambler
Tier 4 — Ship (manufactured from components + modules + minerals): Frigate Hull, Destroyer Hull, Cruiser Hull, Industrial Hull, Battlecruiser Hull
{[ { stage: 'Refining', input: '333 Veldspar', output: '415 Tritanium', example: 'Ore → Mineral', skill: 'None (base 50%)' }, { stage: 'Component Mfg', input: '200 Tritanium + 80 Pyerite', output: '1 Capacitor Unit', example: 'Mineral → Component', skill: 'Industry I' }, { stage: 'Module Mfg', input: '2 Capacitor Units + 150 Tritanium', output: '1 Mining Laser I', example: 'Component → Module', skill: 'Industry II' }, { stage: 'Ship Mfg', input: '5 Component packs + 2000 Tritanium + 800 Pyerite + 100 Nocxium', output: '1 Frigate Hull', example: 'Component+Mineral → Ship', skill: 'Industry III' }, { stage: 'Advanced Ship', input: '15 Component packs + 8000 Tritanium + 3000 Pyerite + 500 Isogen + 200 Nocxium', output: '1 Cruiser Hull', example: 'Multi-tier chain', skill: 'Industry IV' }, ].map((row, i) => ( ))}
StageInputOutputExampleIndustry Skill
{row.stage} {row.input} {row.output} {row.example} {row.skill}
ECON-MFG.2

Blueprint Research (ME / TE)

Every manufacturable item has a Blueprint Original (BPO). BPOs define the base recipe, but they can be researched to improve two attributes: Material Efficiency (ME) reduces mineral waste, and Time Efficiency (TE) reduces manufacturing time. Research costs time and ISK but permanently improves the BPO.

Material Efficiency (ME)

Each ME level reduces material waste by 1%. At ME 0, the recipe uses the base material list (includes 10% waste). At ME 10, waste is reduced to 0%. Research time increases exponentially.

ME 0: 10% waste (base recipe)
ME 1: 9% waste — Research: 30 min + 50,000₢
ME 2: 8% waste — Research: 1h + 100,000₢
ME 5: 5% waste — Research: 8h + 500,000₢
ME 10: 0% waste (perfect) — Research: 48h + 5,000,000₢
Formula: actual_materials = base × (1.0 − ME × 0.01)
Skill gate: Blueprint Research I → ME 3 max · II → ME 5 · III → ME 8 · IV → ME 10

Time Efficiency (TE)

Each TE level reduces manufacturing time by 2%. At TE 0, the recipe takes the base time. At TE 20, manufacturing time is reduced by 40%. TE research is cheaper and faster than ME research.

TE 0: 0% time reduction (base)
TE 5: 10% faster — Research: 15 min + 25,000₢
TE 10: 20% faster — Research: 2h + 200,000₢
TE 15: 30% faster — Research: 12h + 1,000,000₢
TE 20: 40% faster (max) — Research: 24h + 2,500,000₢
Formula: actual_time = base_time × (1.0 − TE × 0.02)
Skill gate: Same skill levels as ME · TE and ME can be researched independently
ECON-MFG.3

Production Queues & Job Management

Job Queue System

Each station has a limited number of manufacturing slots. Players queue jobs and they execute in order. A player can have multiple jobs running simultaneously, limited by their Industry skill level.

Industry I: 1 concurrent job
Industry II: 2 concurrent jobs
Industry III: 3 concurrent jobs
Industry IV: 5 concurrent jobs
Industry V: 8 concurrent jobs (max)

Station Facilities

Not all stations can manufacture everything. Station facility level determines what can be built:

Basic Factory: Modules, ammo, components (any station)
Advanced Factory: Frigates, destroyers, industrials
Capital Yard: Cruisers, battlecruisers
Shipyard: All ships including capitals (null-sec outposts only, post-MVP)

Blueprint Copies (BPC)

BPOs can be copied to create Blueprint Copies (BPCs) with a limited number of runs. BPCs are tradable — a manufacturer can sell BPCs on the market without giving up the original BPO. Copies inherit ME/TE levels from the original.

Copy time: 50% of manufacturing time per run · Max runs: 10 per copy · BPCs stack in inventory

Invention (Post-MVP)

Tech 2 items are created through invention — a research process that consumes a BPC, datacores, and a decryptor to produce a T2 BPC with a probability of success. T2 items are significantly more powerful than T1, making invention a high-value, high-risk specialization.

Success rate: 20–60% (skill-dependent) · Requires: Science skills + datacores · T2 items: 1.5–3× T1 stats
ECON-MFG.4

Manufacturing Economics

Blueprints

Each manufacturable item has a Blueprint Original (BPO) that defines the recipe. BPOs can be researched to reduce mineral waste (Material Efficiency) and production time (Time Efficiency).

ME levels: 0% → 10% waste reduction per level
TE levels: 0% → 20% time reduction per level

Production Chains

Advanced items require intermediate components (not just raw minerals). This creates multi-step production chains where different players can specialize in different stages.

Ore → Mineral → Component → Module → Fitted Ship
Strategic depth: A player with a fully researched BPO (ME 10, TE 20) manufactures at 0% waste and 40% faster than a player using an unresearched BPO. This is a permanent competitive advantage that rewards long-term investment. A veteran industrialist with a researched Cruiser BPO can underprice a newcomer and still profit. The mineral → component → module → ship chain means that industrialists who control the full vertical chain capture the most margin, while those who buy components from the market pay a premium for convenience.
)} {/* NPC PRICING */} {activeSection === 'npc-pricing' && ( <>
ECON-NPC

NPC Price Adjustment Algorithm

Why this matters: NPC buy/sell orders are the economy's floor and ceiling. If NPC prices never move, players will find exploits (buy from NPC in system A, sell to NPC in system B for guaranteed profit). If NPC prices swing too wildly, new players can't predict income and the game feels unfair. The algorithm must be deterministic, transparent to the player through Zora analysis, and self-correcting without manual intervention.
{/* Price seed model */}

Price Seed Model

Every commodity has a base price (the global reference), a regional modifier (set at galaxy generation, reflects local abundance/scarcity), and a dynamic modifier that shifts based on player activity. NPC prices are never random — they are a deterministic function of these three inputs.

NPC Price Formula

npc_price(commodity, station) =
  base_price(commodity)
  × regional_modifier(commodity, region)   // fixed at galaxy gen, range [0.7 – 1.5]
  × demand_pressure(commodity, station)   // dynamic, range [0.8 – 1.4]
  × station_type_factor(station)   // trade hub: 0.95 (cheaper), frontier: 1.15 (premium)

// NPC BUY price (what NPCs pay you) is always below sell:
npc_buy_price = npc_price × buy_spread   // buy_spread ∈ [0.65, 0.85]
npc_sell_price = npc_price × sell_spread   // sell_spread ∈ [1.10, 1.35]
// Spread ensures NPCs always buy lower than they sell.
{/* Base price table */}

Base Prices (Global Reference)

CommodityBase Price (₢/unit)TypeNPC Buy SpreadNPC Sell Spread
Veldspar2.50Ore0.701.25
Scordite4.00Ore0.701.25
Pyroxeres12.00Ore0.681.28
Kernite25.00Ore0.651.30
Tritanium3.20Mineral0.751.20
Pyerite8.00Mineral0.751.20
Nocxium120.00Mineral0.721.22
Megacyte450.00Mineral0.681.30
Mining Laser I800Module1.30
150mm Railgun2,500Module1.30
Frigate Hull15,000Ship1.35
Cruiser Hull80,000Ship1.35
{/* Demand pressure algorithm */}
ECON-NPC.1

Demand Pressure — The Dynamic Modifier

The demand_pressure multiplier is the only dynamic component of NPC prices. It tracks recent buy/sell volume at each station and adjusts prices to simulate supply and demand. This is what prevents infinite arbitrage and makes regional trade meaningful.

Demand Pressure Algorithm

// Each station tracks a rolling demand state per commodity
demand_pressure(commodity, station) computation:

// 1. Accumulate net flow
net_flow = volume_sold_to_npcvolume_bought_from_npc
// Positive = players dumping, NPC inventory filling → price should drop
// Negative = players buying out, NPC stock depleting → price should rise

// 2. Exponential moving average (EMA) — forgets old data
flow_ema = α × net_flow + (1 − α) × prev_flow_ema   // α = 0.3 (adjusts over ~3 ticks)

// 3. Normalize to pressure multiplier
demand_pressure = clamp(1.0 − β × flow_ema, 0.8, 1.4)   // β = 0.002 per unit

// 4. Decay toward 1.0 when idle (no trades)
demand_pressure = lerp(demand_pressure, 1.0, γ)   // γ = 0.05 per tick (5% per 5-min tick)

// Result: high player selling → NPC buy price drops toward floor.
// High player buying → NPC sell price rises toward ceiling.
// No activity → prices decay back to regional baseline.
{/* Worked example */}

Worked Example: Tritanium at Jita IV

Tick-by-Tick Price Trace
Inputs: base_price(Tritanium) = 3.20₢, regional_modifier(The Forge) = 1.05, station_type = Trade Hub (0.95)
Initial: demand_pressure = 1.0 → NPC price = 3.20 × 1.05 × 1.0 × 0.95 = 3.19₢
Tick 1: 5 players sell 2000 units each. net_flow = +10,000. flow_ema = 3,000. demand_pressure = 1.0 − 0.002 × 3000 = 0.80 (clamped)
  → NPC buy price = 3.19 × 0.80 = 2.55₢ (floor hit — NPCs paying minimum)
Tick 2: Players stop selling. flow_ema decays: 0.3×0 + 0.7×3000 = 2,100. demand_pressure = 0.80 → 1.0−0.002×2100 = 0.86
  → NPC buy price = 3.19 × 0.86 = 2.74₢ (recovering)
Tick 3: No trades. Decay: lerp(0.86, 1.0, 0.05) = 0.867. Plus EMA decay continues.
  → demand_pressure ≈ 0.89 → NPC buy price ≈ 2.84₢
Tick 6: Full recovery. demand_pressure → 1.0. NPC buy price = 3.19₢ (baseline restored)
{/* Regional price seeds */}
ECON-NPC.2

Regional Price Seeds

Regional modifiers are set at galaxy generation and never change. They reflect the natural abundance or scarcity of resources in a region. A region rich in Veldspar belts has a low modifier for Veldspar (cheap locally, not worth importing) but might have a high modifier for Megacyte (rare locally, profitable to import). This creates natural trade corridors.

RegionCharacterVeldspar ModNocxium ModMegacyte ModModule Mod
The Forge (Jita)Trade Hub0.900.851.300.95
Domain (Amarr)Manufacturing0.950.900.800.90
Sinq LaisonHigh-sec Mixed1.001.001.201.05
MetropolisBorder Zone1.151.101.351.15
Pure Blind (Null)Null-sec Frontier1.400.700.601.35
Fade (Low-sec)Pirate Corridor1.300.750.751.25
Trade route implication: A player who mines Nocxium in Pure Blind (mod 0.70, cheap) and hauls it to The Forge (mod 0.85) makes a modest profit from regional modifier alone — but the real margin comes from demand_pressure. If Jita has been buying lots of Nocxium (manufacturing cruisers), the demand_pressure there might be 1.15+, making the same haul much more profitable. The dynamic price is the opportunity; the regional seed is the baseline.
{/* Anti-arbitrage safeguards */}
ECON-NPC.3

Anti-Arbitrage Safeguards

Buy-Sell Spread Guarantee

NPC buy price is always ≤ NPC sell price for the same commodity at the same station. The minimum spread (buy_spread × sell_spread⁻¹) is 0.65/1.10 = 0.59 — meaning NPCs pay at most 59% of what they charge. You cannot buy from an NPC and sell back to the same NPC at a profit.

Price Floor & Ceiling

demand_pressure clamps to [0.8, 1.4]. Even at maximum demand, NPC prices only reach 1.4× baseline. Even at maximum oversupply, they only drop to 0.8×. This prevents price spirals in either direction and ensures new players can always estimate their income within a known range.

Station Stock Limits

NPCs have finite order depth. If players flood a station with Veldspar, the NPC buy order eventually fills and the price drops sharply (demand_pressure floor). This limits infinite farming of any single station and encourages players to diversify or find remote stations with unfilled orders.

Cross-Station Price Independence

Each station tracks its own demand_pressure independently. Selling Tritanium at Jita doesn't affect Tritanium prices at Amarr — until the diffusion pipeline propagates the information (see Info Diffusion tab). Players who travel between stations can exploit this lag; players who don't, can't.

{/* Backend schema */}
ECON-NPC.4

Backend Schema for NPC Pricing

SpacetimeDB — NPC Pricing Tables
// Per-station per-commodity demand state
table station_commodity_demand {'{'}
  station_id: u64,
  commodity_id: u64,
  flow_ema: f64,                   // rolling net flow EMA
  demand_pressure: f64,           // current multiplier, clamped [0.8, 1.4]
  volume_sold_to_npc: u64,   // cumulative this tick
  volume_bought_from_npc: u64, // cumulative this tick
  npc_stock_remaining: u64,    // stock limit for buy orders
  last_tick: timestamp,
{'}'}

// Per-commodity base prices and parameters
table commodity_price_params {'{'}
  commodity_id: u64,
  base_price: f64,
  buy_spread: f64,     // [0.65, 0.85]
  sell_spread: f64,     // [1.10, 1.35]
  ema_alpha: f64,       // smoothing factor (default 0.3)
  pressure_beta: f64,    // sensitivity per unit (default 0.002)
  decay_gamma: f64,     // idle decay rate (default 0.05)
{'}'}

// Per-region per-commodity static modifier
table regional_price_seeds {'{'}
  region_id: u64,
  commodity_id: u64,
  modifier: f64,             // fixed at galaxy gen, range [0.6, 1.5]
{'}'}

// Scheduled agent that ticks demand pressure
reducer tick_npc_pricing(ctx) {'{'}
  // Every 5 minutes, for each station_commodity_demand row:
  // 1. Compute net_flow = volume_sold_to_npc - volume_bought_from_npc
  // 2. Update flow_ema with EMA formula
  // 3. Recompute demand_pressure = clamp(1.0 - β × flow_ema, 0.8, 1.4)
  // 4. Apply idle decay: lerp(demand_pressure, 1.0, γ)
  // 5. Reset volume counters for next tick
{'}'}
Tuning knobs: The three parameters (α, β, γ) are per-commodity so that high-value items like Megacyte can be less volatile (lower β) while common ores like Veldspar can react faster. The initial values listed above are defaults — the actual values should be tuned during playtesting by observing how quickly arbitrage opportunities close and whether new players can still estimate their mining income.
)} {/* FAUCETS & SINKS */} {activeSection === 'faucets' && ( <>
ECON-FS

Money Supply: Faucets & Sinks

Critical balance: If faucets exceed sinks, the currency inflates and prices spiral. If sinks exceed faucets, players feel poor and stop engaging. The economy needs continuous monitoring — no fixed formula survives contact with real players.
{faucetsAndSinks.map((item, i) => (
{item.type === 'faucet' ? '▲ FAUCET' : '▼ SINK'}

{item.name}

{item.description}

{item.rate}
))}
)}
); } window.GDD.EconomyPage = EconomyPage;