diff --git a/src/main.lua b/src/main.lua index a19b4fb..23ded06 100644 --- a/src/main.lua +++ b/src/main.lua @@ -256,8 +256,35 @@ local teams = { local battingTeam = teams.away 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) outs = outs + 1 outRunners[#outRunners + 1] = runners[runnerIndex] @@ -268,6 +295,9 @@ function outRunner(runnerIndex) if outs == 3 then outs = 0 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 end end @@ -378,15 +408,6 @@ function updateRunners(currentRunners) return runnerMoved end -function getRunnerTargeting(base) - for _, runner in pairs(runners) do - if runner.nextBase == base then - return runner - end - end - return nil -end - ---@return Base[] function getForcedOutTargets() local targets = {} @@ -402,7 +423,7 @@ function getForcedOutTargets() end --- 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() local farRunnersBase, farDistance for _, runner in pairs(runners) do @@ -424,7 +445,7 @@ function getNextThrowTarget() -- TODO: Handle missed throws, check for fielders at target, etc. local targets = getForcedOutTargets() if #targets ~= 0 then - return targets[1].x, targets[1].y + return targets[#targets].x, targets[#targets].y end local baseCloseToStrandedRunner = getBaseOfStrandedRunner() @@ -495,6 +516,7 @@ function updateBatting() fielders.first.target = Bases[First] batter.nextBase = Bases[First] batter.prevBase = Bases[Home] + updateForcedRunners() batter.forcedTo = Bases[First] batter = nil -- Demote batter to a mere runner @@ -555,7 +577,6 @@ function updateGameState() updateBatting() updateRunners({ batter }) elseif currentMode == Modes.running then - secondsSincePitchAllowed = 0 updateRunning() end diff --git a/src/utils.lua b/src/utils.lua index d21b833..bfb7ee1 100644 --- a/src/utils.lua +++ b/src/utils.lua @@ -14,7 +14,12 @@ end -- Useful for quick print-the-value-in-place debugging. -- selene: allow(unused_variable) function label(value, name) - print(name .. ": " .. value) + if type(value) == "table" then + print(name .. ":") + printTable(value) + else + print(name .. ": " .. value) + end return value end