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:
parent
a46bac174c
commit
e68566957d
47
src/main.lua
47
src/main.lua
|
@ -256,8 +256,35 @@ local teams <const> = {
|
|||
|
||||
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
|
||||
|
||||
|
|
|
@ -14,7 +14,12 @@ end
|
|||
-- Useful for quick print-the-value-in-place debugging.
|
||||
-- selene: allow(unused_variable)
|
||||
function label(value, name)
|
||||
if type(value) == "table" then
|
||||
print(name .. ":")
|
||||
printTable(value)
|
||||
else
|
||||
print(name .. ": " .. value)
|
||||
end
|
||||
return value
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue