Fix some fielding logic.

Runner forcedTo fields are now updated properly.
Fielders can throw to bases other than first.
Also, update label() to handle tables.
This commit is contained in:
Sage Vaillancourt 2025-02-03 00:03:37 -05:00
parent a46bac174c
commit e68566957d
2 changed files with 40 additions and 14 deletions

View File

@ -256,8 +256,35 @@ local teams <const> = {
local battingTeam = teams.away local battingTeam = teams.away
local outs = 0 local outs = 0
function updateForcedRunners() end
---@param base Base
---@return Runner | nil
function getRunnerTargeting(base)
for _, runner in pairs(runners) do
if runner.nextBase == base then
return runner
end
end
return nil
end
function updateForcedRunners()
local stillForced = true
for _, base in ipairs(Bases) do
local runnerTargetingBase = getRunnerTargeting(base)
if runnerTargetingBase then
if stillForced then
runnerTargetingBase.forcedTo = base
else
runnerTargetingBase.forcedTo = nil
end
else
stillForced = false
end
end
end
---@param runnerIndex integer
function outRunner(runnerIndex) function outRunner(runnerIndex)
outs = outs + 1 outs = outs + 1
outRunners[#outRunners + 1] = runners[runnerIndex] outRunners[#outRunners + 1] = runners[runnerIndex]
@ -268,6 +295,9 @@ function outRunner(runnerIndex)
if outs == 3 then if outs == 3 then
outs = 0 outs = 0
announcer:say("SWITCHING SIDES...") announcer:say("SWITCHING SIDES...")
while #runners > 0 do
outRunners[#outRunners + 1] = table.remove(runners, #runners)
end
battingTeam = battingTeam == teams.home and teams.away or teams.home battingTeam = battingTeam == teams.home and teams.away or teams.home
end end
end end
@ -378,15 +408,6 @@ function updateRunners(currentRunners)
return runnerMoved return runnerMoved
end end
function getRunnerTargeting(base)
for _, runner in pairs(runners) do
if runner.nextBase == base then
return runner
end
end
return nil
end
---@return Base[] ---@return Base[]
function getForcedOutTargets() function getForcedOutTargets()
local targets = {} local targets = {}
@ -402,7 +423,7 @@ function getForcedOutTargets()
end end
--- Returns the position,distance of the basest closest to the runner furthest from a base --- Returns the position,distance of the basest closest to the runner furthest from a base
---@return { x: number, y: number } | nil, number | nil ---@return Base | nil, number | nil
function getBaseOfStrandedRunner() function getBaseOfStrandedRunner()
local farRunnersBase, farDistance local farRunnersBase, farDistance
for _, runner in pairs(runners) do for _, runner in pairs(runners) do
@ -424,7 +445,7 @@ function getNextThrowTarget()
-- TODO: Handle missed throws, check for fielders at target, etc. -- TODO: Handle missed throws, check for fielders at target, etc.
local targets = getForcedOutTargets() local targets = getForcedOutTargets()
if #targets ~= 0 then if #targets ~= 0 then
return targets[1].x, targets[1].y return targets[#targets].x, targets[#targets].y
end end
local baseCloseToStrandedRunner = getBaseOfStrandedRunner() local baseCloseToStrandedRunner = getBaseOfStrandedRunner()
@ -495,6 +516,7 @@ function updateBatting()
fielders.first.target = Bases[First] fielders.first.target = Bases[First]
batter.nextBase = Bases[First] batter.nextBase = Bases[First]
batter.prevBase = Bases[Home] batter.prevBase = Bases[Home]
updateForcedRunners()
batter.forcedTo = Bases[First] batter.forcedTo = Bases[First]
batter = nil -- Demote batter to a mere runner batter = nil -- Demote batter to a mere runner
@ -555,7 +577,6 @@ function updateGameState()
updateBatting() updateBatting()
updateRunners({ batter }) updateRunners({ batter })
elseif currentMode == Modes.running then elseif currentMode == Modes.running then
secondsSincePitchAllowed = 0
updateRunning() updateRunning()
end end

View File

@ -14,7 +14,12 @@ end
-- Useful for quick print-the-value-in-place debugging. -- Useful for quick print-the-value-in-place debugging.
-- selene: allow(unused_variable) -- selene: allow(unused_variable)
function label(value, name) function label(value, name)
if type(value) == "table" then
print(name .. ":")
printTable(value)
else
print(name .. ": " .. value) print(name .. ": " .. value)
end
return value return value
end end