diff --git a/components/match2/wikis/fortnite/match_group_input_custom.lua b/components/match2/wikis/fortnite/match_group_input_custom.lua index ee69c06037..040279e381 100644 --- a/components/match2/wikis/fortnite/match_group_input_custom.lua +++ b/components/match2/wikis/fortnite/match_group_input_custom.lua @@ -9,10 +9,11 @@ local Array = require('Module:Array') local Lua = require('Module:Lua') local Operator = require('Module:Operator') +local Variables = require('Module:Variables') local MatchGroupInputUtil = Lua.import('Module:MatchGroup/Input/Util') -local MapFunctions = {} +local CustomMatchGroupInput = {} local MatchFunctions = { OPPONENT_CONFIG = { resolveRedirect = true, @@ -21,31 +22,102 @@ local MatchFunctions = { }, DEFAULT_MODE = 'team' } +local FfaMatchFunctions = { + DEFAULT_MODE = 'solos', +} +local MapFunctions = {} +local FfaMapFunctions = {} -local CustomMatchGroupInput = {} +local DEFAULT_BESTOF = 3 ---@param match table ---@param options table? ---@return table function CustomMatchGroupInput.processMatch(match, options) - return MatchGroupInputUtil.standardProcessFfaMatch(match, MatchFunctions) + return MatchGroupInputUtil.standardProcessMatch(match, MatchFunctions, FfaMatchFunctions) end --- --- match related functions --- +--- Normal 2-opponent Match + +---@param match table +---@param opponents table[] +---@return table[] +function MatchFunctions.extractMaps(match, opponents) + return MatchGroupInputUtil.standardProcessMaps(match, opponents, MapFunctions) +end + +---@param match table +---@param games table[] +---@param opponents table[] +---@return table +function MatchFunctions.getExtraData(match, games, opponents) + return { + mvp = MatchGroupInputUtil.readMvp(match, opponents), + casters = MatchGroupInputUtil.readCasters(match), + } +end + +---@param maps table[] +---@return fun(opponentIndex: integer): integer? +function MatchFunctions.calculateMatchScore(maps) + return function(opponentIndex) + return MatchGroupInputUtil.computeMatchScoreFromMapWinners(maps, opponentIndex) + end +end + +---@param bestofInput string|integer? +---@return integer +function MatchFunctions.getBestOf(bestofInput) + local bestof = tonumber(bestofInput) or tonumber(Variables.varDefault('match_bestof')) or DEFAULT_BESTOF + Variables.varDefine('match_bestof', bestof) + return bestof +end + +---@param games table[] +---@return table[] +function MatchFunctions.removeUnsetMaps(games) + return Array.filter(games, function(map) + return map.map ~= nil + end) +end + +---@param match table +---@param map table +---@param opponents table[] +---@return table +function MapFunctions.getExtraData(match, map, opponents) + return { + comment = map.comment, + } +end + +---@param map table +---@return fun(opponentIndex: integer): integer? +function MapFunctions.calculateMapScore(map) + local winner = tonumber(map.winner) + return function(opponentIndex) + -- TODO Better to check if map has started, rather than finished, for a more correct handling + if not winner and not map.finished then + return + end + return winner == opponentIndex and 1 or 0 + end +end + +--- FFA Match + ---@param match table ---@param opponents table[] ---@param scoreSettings table ---@return table[] -function MatchFunctions.extractMaps(match, opponents, scoreSettings) - return MatchGroupInputUtil.standardProcessFfaMaps(match, opponents, scoreSettings, MapFunctions) +function FfaMatchFunctions.extractMaps(match, opponents, scoreSettings) + return MatchGroupInputUtil.standardProcessFfaMaps(match, opponents, scoreSettings, FfaMapFunctions) end ---@param opponents table[] ---@param maps table[] ---@return fun(opponentIndex: integer): integer? -function MatchFunctions.calculateMatchScore(opponents, maps) +function FfaMatchFunctions.calculateMatchScore(opponents, maps) return function(opponentIndex) return Array.reduce(Array.map(maps, function(map) return map.opponents[opponentIndex].score or 0 @@ -58,26 +130,23 @@ end ---@param opponents table[] ---@param settings table ---@return table -function MatchFunctions.getExtraData(match, games, opponents, settings) +function FfaMatchFunctions.getExtraData(match, games, opponents, settings) return { placementinfo = settings.placementInfo, settings = settings.settings, } end --- --- map related functions --- - ---@param match table ---@param map table ---@param opponents table[] ---@return table -function MapFunctions.getExtraData(match, map, opponents) +function FfaMapFunctions.getExtraData(match, map, opponents) return { dateexact = map.dateexact, comment = map.comment, } end + return CustomMatchGroupInput