From 82cf4d62c2177d0173f4ed78a8529a418667bc35 Mon Sep 17 00:00:00 2001 From: Rikard Blixt Date: Thu, 12 Dec 2024 15:36:25 +0100 Subject: [PATCH] feat(match2): support call of duty warzone (BR) --- .../match2/wikis/callofduty/game_summary.lua | 46 +++++++++++++ .../get_match_group_copy_paste_wiki.lua | 63 ++++++++++++++++++ .../callofduty/match_group_input_custom.lua | 65 +++++++++++++++---- .../wikis/callofduty/match_summary_ffa.lua | 44 +++++++++++++ 4 files changed, 207 insertions(+), 11 deletions(-) create mode 100644 components/match2/wikis/callofduty/game_summary.lua create mode 100644 components/match2/wikis/callofduty/match_summary_ffa.lua diff --git a/components/match2/wikis/callofduty/game_summary.lua b/components/match2/wikis/callofduty/game_summary.lua new file mode 100644 index 00000000000..0fd2172ac7d --- /dev/null +++ b/components/match2/wikis/callofduty/game_summary.lua @@ -0,0 +1,46 @@ +--- +-- @Liquipedia +-- wiki=callofduty +-- page=Module:GameSummary +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local CustomGameSummary = {} + +local Lua = require('Module:Lua') + +local MatchGroupUtil = Lua.import('Module:MatchGroup/Util') + +local SummaryHelper = Lua.import('Module:MatchSummary/Base/Ffa') +local MatchSummaryWidgets = Lua.import('Module:Widget/Match/Summary/Ffa/All') + +---@class CoDFfaMatchGroupUtilGame: MatchGroupUtilGame +---@field stream table + +---@param props {bracketId: string, matchId: string, gameIdx: integer} +---@return Html +function CustomGameSummary.getGameByMatchId(props) + ---@class CoDFfaMatchGroupUtilMatch + local match = MatchGroupUtil.fetchMatchForBracketDisplay(props.bracketId, props.matchId) + + local game = match.games[props.gameIdx] + assert(game, 'Error Game ID ' .. tostring(props.gameIdx) .. ' not found') + + game.stream = match.stream + + SummaryHelper.updateGameOpponents(game, match.opponents) + local scoringData = SummaryHelper.createScoringData(match) + + return MatchSummaryWidgets.Tab{ + matchId = match.matchId, + idx = props.gameIdx, + children = { + MatchSummaryWidgets.GameDetails{game = game}, + MatchSummaryWidgets.PointsDistribution{scores = scoringData}, + SummaryHelper.standardGame(game) + } + } +end + +return CustomGameSummary diff --git a/components/match2/wikis/callofduty/get_match_group_copy_paste_wiki.lua b/components/match2/wikis/callofduty/get_match_group_copy_paste_wiki.lua index cfb5f148e47..aeaa0c98a9e 100644 --- a/components/match2/wikis/callofduty/get_match_group_copy_paste_wiki.lua +++ b/components/match2/wikis/callofduty/get_match_group_copy_paste_wiki.lua @@ -13,6 +13,9 @@ local Lua = require('Module:Lua') local BaseCopyPaste = Lua.import('Module:GetMatchGroupCopyPaste/wiki/Base') +local OpponentLibraries = require('Module:OpponentLibraries') +local Opponent = OpponentLibraries.Opponent + ---@class CallofDutyMatch2CopyPaste: Match2CopyPasteBase local WikiCopyPaste = Class.new(BaseCopyPaste) @@ -26,6 +29,20 @@ local INDENT = WikiCopyPaste.Indent ---@param args table ---@return string function WikiCopyPaste.getMatchCode(bestof, mode, index, opponents, args) + if opponents > 2 then + return WikiCopyPaste.getFfaMatchCode(bestof, mode, index, opponents, args) + else + return WikiCopyPaste.getStandardMatchCode(bestof, mode, index, opponents, args) + end +end + +---@param bestof integer +---@param mode string +---@param index integer +---@param opponents integer +---@param args table +---@return string +function WikiCopyPaste.getStandardMatchCode(bestof, mode, index, opponents, args) local showScore = Logic.nilOr(Logic.readBool(args.score), bestof == 0) local opponent = WikiCopyPaste.getOpponent(mode, showScore) @@ -47,4 +64,50 @@ function WikiCopyPaste.getMatchCode(bestof, mode, index, opponents, args) return table.concat(lines, '\n') end +---@param bestof integer +---@param mode string +---@param index integer +---@param opponents integer +---@param args table +---@return string +function WikiCopyPaste.getFfaMatchCode(bestof, mode, index, opponents, args) + local lines = Array.extend( + '{{Match|finished=', + INDENT .. '|p_kill=1 |p1_kill=2 |p2_kill=1.8 |p3_kill=1.8 |p4_kill=1.8 |p5_kill=1.8 ' .. + '|p6_kill=1.6 |p7_kill=1.6 |p8_kill=1.6 |p9_kill=1.6 |p10_kill=1.6 ' .. + '|p11_kill=1.4 |p12_kill=1.4 |p13_kill=1.4 |p14_kill=1.4 |p15_kill=1.4 ' .. + '|p16_kill=1.2 |p17_kill=1.2 |p18_kill=1.2 |p19_kill=1.2 |p20_kill=1.2 ' .. + '|p21_kill=1.2 |p22_kill=1.2 |p23_kill=1.2 |p24_kill=1.2 |p25_kill=1.2 ' .. + INDENT .. '|twitch=|youtube=', + Array.map(Array.range(1, bestof), function(mapIndex) + return INDENT .. '|map' .. mapIndex .. '={{Map|map=|date=|finished=|vod=}}' + end), + Array.map(Array.range(1, opponents), function(opponentIndex) + return INDENT .. '|opponent' .. opponentIndex .. '=' .. WikiCopyPaste._getFfaOpponent(mode, bestof) + end), + '}}' + ) + + return table.concat(lines, '\n') +end + +---@param mode string +---@param mapCount integer +---@return string +function WikiCopyPaste._getFfaOpponent(mode, mapCount) + local mapScores = table.concat(Array.map(Array.range(1, mapCount), function(idx) + return '|m' .. idx .. '={{MS||}}' + end)) + + if mode == Opponent.solo then + return '{{SoloOpponent||flag=' .. mapScores .. '}}' + elseif mode == Opponent.team then + return '{{TeamOpponent|' .. mapScores .. '}}' + elseif mode == Opponent.literal then + return '{{Literal|}}' + end + + return '' +end + return WikiCopyPaste diff --git a/components/match2/wikis/callofduty/match_group_input_custom.lua b/components/match2/wikis/callofduty/match_group_input_custom.lua index 9e96cc59ddc..fe778e147fc 100644 --- a/components/match2/wikis/callofduty/match_group_input_custom.lua +++ b/components/match2/wikis/callofduty/match_group_input_custom.lua @@ -9,6 +9,7 @@ local Array = require('Module:Array') local Logic = require('Module:Logic') local Lua = require('Module:Lua') +local Operator = require('Module:Operator') local Variables = require('Module:Variables') local MatchGroupInputUtil = Lua.import('Module:MatchGroup/Input/Util') @@ -16,21 +17,23 @@ local MatchGroupInputUtil = Lua.import('Module:MatchGroup/Input/Util') local DEFAULT_BESTOF = 3 local CustomMatchGroupInput = {} -local MatchFunctions = {} +local MatchFunctions = { + DEFAULT_MODE = 'team', +} local MapFunctions = {} - -MatchFunctions.DEFAULT_MODE = 'team' +local FfaMatchFunctions = { + DEFAULT_MODE = 'team', +} +local FfaMapFunctions = {} ---@param match table ---@param options table? ---@return table function CustomMatchGroupInput.processMatch(match, options) - return MatchGroupInputUtil.standardProcessMatch(match, MatchFunctions) + return MatchGroupInputUtil.standardProcessMatch(match, MatchFunctions, FfaMatchFunctions) end --- --- match related functions --- +-- "Normal" match ---@param match table ---@param opponents table[] ---@return table[] @@ -72,10 +75,6 @@ function MatchFunctions.getExtraData(match, games, opponents) } end --- --- map related functions --- - ---@param match table ---@param map table ---@param opponents table[] @@ -86,4 +85,48 @@ function MapFunctions.getExtraData(match, map, opponents) } end +--- FFA Match + +---@param match table +---@param opponents table[] +---@param scoreSettings table +---@return table[] +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 FfaMatchFunctions.calculateMatchScore(opponents, maps) + return function(opponentIndex) + return Array.reduce(Array.map(maps, function(map) + return map.opponents[opponentIndex].score or 0 + end), Operator.add, 0) + (opponents[opponentIndex].extradata.startingpoints or 0) + end +end + +---@param match table +---@param games table[] +---@param opponents table[] +---@param settings table +---@return table +function FfaMatchFunctions.getExtraData(match, games, opponents, settings) + return { + placementinfo = settings.placementInfo, + settings = settings.settings, + } +end + +---@param match table +---@param map table +---@param opponents table[] +---@return table +function FfaMapFunctions.getExtraData(match, map, opponents) + return { + dateexact = map.dateexact, + comment = map.comment, + } +end + return CustomMatchGroupInput diff --git a/components/match2/wikis/callofduty/match_summary_ffa.lua b/components/match2/wikis/callofduty/match_summary_ffa.lua new file mode 100644 index 00000000000..402023ac242 --- /dev/null +++ b/components/match2/wikis/callofduty/match_summary_ffa.lua @@ -0,0 +1,44 @@ +--- +-- @Liquipedia +-- wiki=callofduty +-- page=Module:MatchSummary/Ffa +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local CustomMatchSummary = {} + +local Lua = require('Module:Lua') + +local MatchGroupUtil = Lua.import('Module:MatchGroup/Util') +local SummaryHelper = Lua.import('Module:MatchSummary/Base/Ffa') + +local MatchSummaryWidgets = Lua.import('Module:Widget/Match/Summary/Ffa/All') +local HtmlWidgets = Lua.import('Module:Widget/Html/All') + +---@class CoDFfaMatchGroupUtilMatch: MatchGroupUtilMatch +---@field games CoDFfaMatchGroupUtilGame[] + +---@param props {bracketId: string, matchId: string} +---@return Widget +function CustomMatchSummary.getByMatchId(props) + ---@class CoDFfaMatchGroupUtilMatch + local match = MatchGroupUtil.fetchMatchForBracketDisplay(props.bracketId, props.matchId) + SummaryHelper.updateMatchOpponents(match) + local scoringData = SummaryHelper.createScoringData(match) + + return HtmlWidgets.Fragment{children = { + MatchSummaryWidgets.Header{matchId = match.matchId, games = match.games}, + MatchSummaryWidgets.Tab{ + matchId = match.matchId, + idx = 0, + children = { + MatchSummaryWidgets.GamesSchedule{games = match.games}, + MatchSummaryWidgets.PointsDistribution{scores = scoringData}, + SummaryHelper.standardMatch(match), + } + } + }} +end + +return CustomMatchSummary