Ballparks

In short

There are five run maps (Sandlot Field, Farmyard, Windy City Yard, Midnight Yard, Moon Stadium) and one practice park (Scoreboard Smash, batting cage only). The order of db.ballparks is the unlock order, and each step along it multiplies every inning goal by 1.15.

How it works

  1. DefaultContent.Build() creates every park with Park(id, name, description, lf, cf, rf, wallFt, grass, wall) and then sets its extras (wind, gravity, sky, targets, special ball, final boss, look).
  2. db.ballparks.AddRange(new[] { sandlot, farm, windy, midnight, moon }) sets the unlock order. The first map is always open. Beating a map on Medium opens the next one (see Map Select and Unlocks).
  3. db.practiceParks.Add(smash): practice parks are only in the Batting Cage. They are never run maps, never unlocked and not in the co-op lobby.
  4. A run is played at one park. Its wall, wind and gravity feed Hit Physics; its batterModifiers are added to the batter’s stats for every at-bat there (Stats); its balls list feeds Special Balls; its targets feed Scoring.
  5. Each run map has its own final boss (finalBossId) who always pitches inning 9 there and nowhere else (Pitchers and Bosses).
  6. The map select screen is a carousel (#39): parks slide left to right in unlock order, and the centred card shows a picture of the park taken at runtime (UI/ParkSnapshots, built and photographed once per session), its NORMAL / MEDIUM / HARD and PLAY. See Map Select and Unlocks.
  7. The batting cage lists every run map in unlock order, then the practice parks. The INDEX’s BALLPARKS tab lists the practice parks first (subtitle “Batting cage”), then the run maps (Index Screen).

Comparison

ParkidOrderLF / CF / RF (ft)Wall (ft)GravityWindSkyNightStadiumSpecial ballFinal boss
Sandlot Fieldsandlot1300 / 360 / 3008x1noneClearDaynoyes$$$ (Money), any pitch, 1 in 6Backyard Benny (benny)
Farmyardfarm2310 / 380 / 3156x16 mph toward 20°ClearDaynono (open field)Sticky, changeup / curveball / knuckleball, 1 in 3Farmer Fitz (farmer)
Windy City Yardwindy3330 / 400 / 34012x112 mph toward -30°OvercastnoyesSuper Fast, fastball / slider, 1 in 3The Gale (gale)
Midnight Yardmidnight4330 / 400 / 33010x1noneNightyesyesGhost, any pitch, 1 in 12The Phantom (phantom)
Moon Stadiummoon5380 / 450 / 38020x0.75noneSpacenoyesAnti-Gravity, curveball / sinker / changeup, 1 in 3The Alien (alien)
Scoreboard Smashsmashpractice280 / 300 / 2808x1noneClearDaynono (open field)nonenone (never a run map)
ParkBatter modifiersTargetsGround / wallDressing
Sandlot FieldnoneBillboard x2, Treehouse x3Mowed / Paddednone
FarmyardnoneLeft Bullseye x3, Barn x2, Right Bullseye x2.5Sandlot / WoodFencefarm code layout (ParkLayouts.BuildFarm)
Windy City YardnoneRooftop x2, Lake x3Mowed / Paddednone
Midnight Yard-10% Timing WindowNeon Sign x2.5Mowed / Paddednone
Moon Stadiumnone8 bonus locations, +50 to +200 pointsLunar / Paddedmoon code layout (ParkLayouts.BuildMoon)
Scoreboard Smashnonenone (break the scoreboard)Mowed / Paddednone

Every run map sets finalBossId (all five park bosses came in #41, the Phantom boss PR). Their own balls: Benny throws Wiffle balls, The Gale Headwind / Tailwind gusts, The Phantom decoys; Farmer Fitz and The Alien have none yet. Where a park’s ball rides only some pitches (Farmyard, Windy City, Moon), pitchers lean on those pitches, about 70% of the time (PitcherAI.FavouredShare).

Numbers

Goal scaling by park (RunState.InningGoal): inningGoal x inningGoalGrowth^inning x (bossGoalMultiplier if boss) x mapGoalGrowth^order x difficulty, rounded to the nearest 25 (minimum 25). See Run Config and Difficulty.

ParkOrder indexGoal multiplier (1.15^order)Inning 1 goal, NormalInning 9 goal, Normal
Sandlot Field0x15003725
Farmyard1x1.155754275
Windy City Yard2x1.32256504925
Midnight Yard3x1.5208757505675
Moon Stadium4x1.749006258756525

Full per-inning goals are in each park’s note. Defaults for a park field not set in DefaultContent:

WhatDefaultWhere to tune
leftFieldFt / centerFieldFt / rightFieldFt330 / 400 / 330BallparkDefinition
wallHeightFt10BallparkDefinition
gravityScale1 (gravity = 9.81 m/s² x scale)BallparkDefinition.GetEnvironment
crowdDensity0.75BallparkDefinition
stadiumtrueBallparkDefinition
sky / ground / wallStyleClearDay / Mowed / PaddedBallparkDefinition
Target multiplier2OutfieldTarget

In the code

FileWhat it does
Assets/_Project/Scripts/Data/DefaultContent.csDefines every park and the unlock order (db.ballparks, db.practiceParks)
Assets/_Project/Scripts/Data/BallparkDefinition.csFields, OutfieldTarget, SkyPreset, GroundStyle, WallStyle; WallDistanceFt, GetEnvironment, DescribeModifiers
Assets/_Project/Scripts/Run/RunState.csInningGoal uses the park’s index in ballparks
Assets/_Project/Scripts/Ballparks/ParkLayouts.csCode-built dressings for farm and moon
Assets/_Project/Scripts/Ballparks/SkyBuilder.csSky per SkyPreset
Assets/_Project/Scripts/UI/MapSelectView.csThe park carousel; UI/ParkSnapshots takes each card’s picture

Gotchas

  • The wall distance between the three values is a straight lerp by spray angle: WallDistanceFt clamps spray to ±45° and lerps from center to the line.
  • Reordering db.ballparks changes both the unlock order and every park’s goals.
  • farm.dressing and moon.dressing point at Parks/farm_Dressing and Parks/moon_Dressing, but there is still no Resources/Parks folder at 45a2167, so both parks use their code layout from ParkLayouts.
  • The game loads Resources/ContentDatabase if it exists; at 45a2167 there is none, so DefaultContent is the live data.
  • The README’s roadmap still says “Starter ballparks (4 maps)“. The code has five run maps plus one practice park.
  • Midnight’s Ghost ball changed in #41 from changeups and knuckleballs at 1 in 4 to any pitch at 1 in 12.