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 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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue