import type { GameConfig } from "../schemas"; /** Default tuning. All numbers are first guesses until balancing in Phase 12. */ export const gameConfig: GameConfig = { // 1 real minute = 1 game hour. timeCompression: 60, // The in-game date shown when the clock started (decision 0.5.9). epoch: { realStart: "2026-01-01T00:00:00Z", gameStart: "2100-01-01T00:00:00Z", }, // A small cushion: a couple of Courier fuel loads from Earth (CR-001). startingCredits: 500, tutorialPayoutShare: 0.5, contractBoardSize: 8, // One tutorial contract per mass tier (CR-001). tutorialBoardSize: 3, tutorialLoanerShipModelId: "company-courier", // Five runs, at double XP, so the avatar has a skill point at the deal (CR-017). tutorialRunsBeforeDeal: 5, tutorialXpMultiplier: 2, tutorialMassTonnes: { light: 5, medium: 12, full: 20 }, // 20 t adds 0.4 game hours (24 real seconds) of loading and unloading. handlingGameHoursPerTonne: 0.02, loanRepaymentShare: 0.25, // The deal (CR-013): Halvorsen's Courier for the avatar, his Clipper for the // veteran, and the Earth bay. The loan is computed from their prices. // The deal's ships come with full tanks (CR-018, decision 0.5.111). deal: { avatarShipModelId: "courier", veteranShipModelId: "clipper", bayLocationId: "earth", }, contractBoardPeriodRealMinutes: 10, // Housekeeping (Step 7.3, CR-014): four hours of boards; a week of seen trips. boardRetentionPeriods: 24, savedDispatchRetentionRealHours: 168, logbookRetentionRealDays: 7, // Fuel (CR-015): credits per fu before each location's price multiple, and // the emergency fuel markup (decisions 0.5.96, 0.5.99). Halved by CR-018 // (decision 0.5.110): the balance script prints each ship and route's fuel share. baseFuelPricePerFu: 5, emergencyFuelMultiplier: 2.5, // Pay and fuel scale gently with distance past an Earth–Moon leg (decision 0.5.84). economicDistance: { referenceMillionKm: 0.384, exponent: 0.65 }, // Ship upgrades (CR-009): level 1, 2, 3. upgradeLevels: [ { costPercentOfPrice: 10, shopRealMinutes: 10 }, { costPercentOfPrice: 20, shopRealMinutes: 20 }, { costPercentOfPrice: 35, shopRealMinutes: 30 }, ], // Duty and rest (CR-004): about three Moon round trips, then rest. dutyLimitGameHours: 12, longHaulDutyBonusGameHours: 2, // One board period (10 real minutes at 60× compression), so a rested pilot // always wakes to a fresh board (decision 0.5.46). restGameHours: 10, firstContactChance: 0.1, firstContactPayoutMultiplier: 2, // Each board contract pays its own market rate, ±15% (CR-008). contractPayVariance: 0.15, // Priority contracts (CR-007): 15% of eligible goods, ×1.5 pay, a window as // long as a Freighter's trip. priorityChance: 0.15, priorityPayoutMultiplier: 1.5, priorityReferenceShipModelId: "freighter", priorityWindowFactor: 1, // One band per ship size, so every board has work for every ship (playtest fix): // up to a Courier's 20 t, a Freighter's 100 t, and a Bulk Hauler's 400 t. contractMassBands: [ { min: 5, max: 20, count: 3 }, { min: 21, max: 100, count: 3 }, { min: 101, max: 400, count: 2 }, ], // Boards that fit the fleet (CR-006): a band no ship can carry keeps one // preview job; flyable bands keep one open job, the rest fit a ship and pilot. boardPreviewSlots: 1, boardOpenSlotsPerBand: 1, // Boards keep only jobs the fleet can complete (CR-019): candidates tried at most. boardMaxAttempts: 200, // Mars at its closest needs no Long Haul; Jupiter at its farthest needs level 5. longHaulCutoffsMillionKm: [100, 250, 400, 600, 800], xpPerDelivery: { base: 10, perMillionKm: 0.2, perCargoTier: 5 }, pilotLevelXpThresholds: [100, 250, 450, 700, 1000, 1400, 1900, 2500, 3200, 4000], // Ten levels × 2 points = enough to max all four skills (4 × 5 levels). skillPointsPerLevel: 2, pilotHireCost: 2000, // A quarter of each contract's profit (payout − fuel) goes to a hired pilot (CR-010). pilotProfitShare: 0.25, // Independent pilots (CR-021): the Dispatch Office costs about a Lighter; the // player has the first 3 minutes of every 10-minute board; pilots turn round // in 15 game minutes (15 real seconds) and head home after 3 empty boards. independentPilots: { dispatchOfficePrice: 36_000, firstLookRealMinutes: 3, turnaroundGameMinutes: 15, emptyPeriodsBeforeHome: 3, maxCatchUpRealDays: 7, defaultSpendingFloor: 500, }, fleetSleep: { defaultHours: 24, optionsHours: [12, 24, 48, 72] }, events: { baseChance: 0.02, chancePerGameHour: 0.004, maxChance: 0.35, localLoopMultiplier: 0.5, beltCrossingMultiplier: 1.3, stormArrivalMultiplier: 1.2, shipCooldownTrips: 2, fleetRadioGapRealMinutes: 45, graceTripsAfterDeal: 3, firstEventId: "derelict-pod", firstEventMinTripGameHours: 6, fireFrom: 0.2, fireTo: 0.7, responseWindowRealMinutes: 30, minTripFraction: 0.5, }, hull: { floorPct: 5, ratingReductionPerPoint: 0.1, maxRatingReduction: 0.5, noDangerousBelowPct: 50, needsRepairBelowPct: 25, damagedChanceMultiplier: 2, repairCostPerPoint: 0.01, repairRealMinutesPerPoint: 0.5, repairMinRealMinutes: 5, wearPerGameHour: 0.35, }, };