C = {}
C.Screen = {
W = playdate and playdate.display.getWidth() or 400,
H = playdate and playdate.display.getHeight() or 240,
}
C.Center = utils.xy(C.Screen.W / 2, C.Screen.H / 2)
C.StrikeZoneStartX = C.Center.x - 16
C.StrikeZoneEndX = C.StrikeZoneStartX + 24
C.StrikeZoneStartY = C.Screen.H - 35
--- @alias Base {
--- x: number,
--- y: number,
--- }
---@type Base[]
C.Bases = {
utils.xy(C.Screen.W * 0.93, C.Screen.H * 0.52),
utils.xy(C.Screen.W * 0.47, C.Screen.H * 0.19),
utils.xy(C.Screen.W * 0.03, C.Screen.H * 0.52),
utils.xy(C.Screen.W * 0.474, C.Screen.H * 0.79),
}
C.First, C.Second, C.Third, C.Home = 1, 2, 3, 4
C.FieldHeight = C.Bases[C.Home].y - C.Bases[C.Second].y
-- Pseudo-base for batter to target
C.RightHandedBattersBox = {
x = C.Bases[C.Home].x - 30,
y = C.Bases[C.Home].y + 10,
}
---@type table
C.NextBaseMap = {
[C.RightHandedBattersBox] = nil, -- Runner should not escape the box before a hit!
[C.Bases[C.First]] = C.Bases[C.Second],
[C.Bases[C.Second]] = C.Bases[C.Third],
[C.Bases[C.Third]] = C.Bases[C.Home],
}
C.LeftFoulLine = {
x1 = C.Center.x,
y1 = 220,
x2 = -1800,
y2 = -465,
}
C.RightFoulLine = {
x1 = C.Center.x,
y1 = 218,
x2 = 2120,
y2 = -465,
}
--- Angle to align the bat to
C.CrankOffsetDeg = 90
C.DanceBounceMs = 500
C.DanceBounceCount = 4
C.ScoreboardDelayMs = 2000
--- Used to draw the ball well out of bounds, and
--- generally as a check for whether or not it's in play.
C.BallOffscreen = 999
C.PitchAfterSeconds = 6
C.ReturnToPitcherAfterSeconds = 2.4
C.PitchFlyMs = 1050
C.PitchStart = utils.xy(195, 105)
C.PitchEndY = 240
C.DefaultLaunchPower = 4
--- The max distance at which a fielder can tag out a runner.
C.TagDistance = 15
C.BallCatchHitbox = 3
--- The max distance at which a runner can be considered on base.
C.BaseHitbox = 10
C.BattingPower = 25
C.BatterHandPos = utils.xy(25, 15)
C.GloveZ = 0 -- 10
C.SmallestBallRadius = 6
C.BatLength = 35
---@alias OffenseState "batting" | "running" | "walking" | "homeRun"
--- An enum for what state the offense is in
---@type table
C.Offense = {
batting = "batting",
running = "running",
walking = "walking",
homeRun = "homeRun",
}
---@alias Side "offense" | "defense"
C.PitcherStartPos = {
x = C.Screen.W * 0.48,
y = C.Screen.H * 0.40,
}
--- Controls how hard the ball can be hit, and
--- how fast the ball can be thrown.
C.CrankPower = 10
C.FielderRunMult = 1.3
C.PlayerHeightOffset = 20
C.UserThrowPower = 0.3
--- How fast baserunners move after a walk
C.WalkedRunnerSpeed = 10
C.ResetFieldersAfterSeconds = 2.5
C.OutfieldWall = {
{ x = -400, y = -103 },
{ x = -167, y = -208 },
{ x = 50, y = -211 },
{ x = 150, y = -181 },
{ x = 339, y = -176 },
{ x = 450, y = -221 },
{ x = 700, y = -209 },
{ x = 785, y = -59 },
{ x = 801, y = -16 },
}
C.BottomOfOutfieldWall = {}
for i, v in ipairs(C.OutfieldWall) do
C.BottomOfOutfieldWall[i] = utils.xy(v.x, v.y + 40)
end
if not playdate then
return C
end