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.ballparksis the unlock order, and each step along it multiplies every inning goal by 1.15.
How it works
DefaultContent.Build()creates every park withPark(id, name, description, lf, cf, rf, wallFt, grass, wall)and then sets its extras (wind, gravity, sky, targets, special ball, final boss, look).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).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.- A run is played at one park. Its wall, wind and gravity feed Hit Physics; its
batterModifiersare added to the batter’s stats for every at-bat there (Stats); itsballslist feeds Special Balls; itstargetsfeed Scoring. - Each run map has its own final boss (
finalBossId) who always pitches inning 9 there and nowhere else (Pitchers and Bosses). - 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. - 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
| Park | id | Order | LF / CF / RF (ft) | Wall (ft) | Gravity | Wind | Sky | Night | Stadium | Special ball | Final boss |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Sandlot Field | sandlot | 1 | 300 / 360 / 300 | 8 | x1 | none | ClearDay | no | yes | $$$ (Money), any pitch, 1 in 6 | Backyard Benny (benny) |
| Farmyard | farm | 2 | 310 / 380 / 315 | 6 | x1 | 6 mph toward 20° | ClearDay | no | no (open field) | Sticky, changeup / curveball / knuckleball, 1 in 3 | Farmer Fitz (farmer) |
| Windy City Yard | windy | 3 | 330 / 400 / 340 | 12 | x1 | 12 mph toward -30° | Overcast | no | yes | Super Fast, fastball / slider, 1 in 3 | The Gale (gale) |
| Midnight Yard | midnight | 4 | 330 / 400 / 330 | 10 | x1 | none | Night | yes | yes | Ghost, any pitch, 1 in 12 | The Phantom (phantom) |
| Moon Stadium | moon | 5 | 380 / 450 / 380 | 20 | x0.75 | none | Space | no | yes | Anti-Gravity, curveball / sinker / changeup, 1 in 3 | The Alien (alien) |
| Scoreboard Smash | smash | practice | 280 / 300 / 280 | 8 | x1 | none | ClearDay | no | no (open field) | none | none (never a run map) |
| Park | Batter modifiers | Targets | Ground / wall | Dressing |
|---|---|---|---|---|
| Sandlot Field | none | Billboard x2, Treehouse x3 | Mowed / Padded | none |
| Farmyard | none | Left Bullseye x3, Barn x2, Right Bullseye x2.5 | Sandlot / WoodFence | farm code layout (ParkLayouts.BuildFarm) |
| Windy City Yard | none | Rooftop x2, Lake x3 | Mowed / Padded | none |
| Midnight Yard | -10% Timing Window | Neon Sign x2.5 | Mowed / Padded | none |
| Moon Stadium | none | 8 bonus locations, +50 to +200 points | Lunar / Padded | moon code layout (ParkLayouts.BuildMoon) |
| Scoreboard Smash | none | none (break the scoreboard) | Mowed / Padded | none |
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.
| Park | Order index | Goal multiplier (1.15^order) | Inning 1 goal, Normal | Inning 9 goal, Normal |
|---|---|---|---|---|
| Sandlot Field | 0 | x1 | 500 | 3725 |
| Farmyard | 1 | x1.15 | 575 | 4275 |
| Windy City Yard | 2 | x1.3225 | 650 | 4925 |
| Midnight Yard | 3 | x1.520875 | 750 | 5675 |
| Moon Stadium | 4 | x1.74900625 | 875 | 6525 |
Full per-inning goals are in each park’s note. Defaults for a park field not set in DefaultContent:
| What | Default | Where to tune |
|---|---|---|
leftFieldFt / centerFieldFt / rightFieldFt | 330 / 400 / 330 | BallparkDefinition |
wallHeightFt | 10 | BallparkDefinition |
gravityScale | 1 (gravity = 9.81 m/s² x scale) | BallparkDefinition.GetEnvironment |
crowdDensity | 0.75 | BallparkDefinition |
stadium | true | BallparkDefinition |
sky / ground / wallStyle | ClearDay / Mowed / Padded | BallparkDefinition |
Target multiplier | 2 | OutfieldTarget |
In the code
| File | What it does |
|---|---|
Assets/_Project/Scripts/Data/DefaultContent.cs | Defines every park and the unlock order (db.ballparks, db.practiceParks) |
Assets/_Project/Scripts/Data/BallparkDefinition.cs | Fields, OutfieldTarget, SkyPreset, GroundStyle, WallStyle; WallDistanceFt, GetEnvironment, DescribeModifiers |
Assets/_Project/Scripts/Run/RunState.cs | InningGoal uses the park’s index in ballparks |
Assets/_Project/Scripts/Ballparks/ParkLayouts.cs | Code-built dressings for farm and moon |
Assets/_Project/Scripts/Ballparks/SkyBuilder.cs | Sky per SkyPreset |
Assets/_Project/Scripts/UI/MapSelectView.cs | The park carousel; UI/ParkSnapshots takes each card’s picture |
Gotchas
- The wall distance between the three values is a straight lerp by spray angle:
WallDistanceFtclamps spray to ±45° and lerps from center to the line. - Reordering
db.ballparkschanges both the unlock order and every park’s goals. farm.dressingandmoon.dressingpoint atParks/farm_DressingandParks/moon_Dressing, but there is still noResources/Parksfolder at 45a2167, so both parks use their code layout fromParkLayouts.- The game loads
Resources/ContentDatabaseif it exists; at 45a2167 there is none, soDefaultContentis 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.
Related
- Map Select and Unlocks: how maps and difficulties open
- Ballpark Building: how the field, stands and props are built
- Special Balls: what each park’s ball does
- Scoring: how targets pay
- Pitchers and Bosses: each park’s final boss
- Add a Map: adding a new park