132 lines
5.2 KiB
TypeScript
132 lines
5.2 KiB
TypeScript
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,
|
||
},
|
||
};
|