diff --git a/components/match2/wikis/halo/game_summary.lua b/components/match2/wikis/halo/game_summary.lua new file mode 100644 index 00000000000..73b518db4be --- /dev/null +++ b/components/match2/wikis/halo/game_summary.lua @@ -0,0 +1,46 @@ +--- +-- @Liquipedia +-- wiki=halo +-- 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 HaloFfaMatchGroupUtilGame: MatchGroupUtilGame +---@field stream table + +---@param props {bracketId: string, matchId: string, gameIdx: integer} +---@return Html +function CustomGameSummary.getGameByMatchId(props) + ---@class HaloFfaMatchGroupUtilMatch + 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/halo/get_match_group_copy_paste_wiki.lua b/components/match2/wikis/halo/get_match_group_copy_paste_wiki.lua index 17251f181e9..b32bfd58e30 100644 --- a/components/match2/wikis/halo/get_match_group_copy_paste_wiki.lua +++ b/components/match2/wikis/halo/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 HaloMatch2CopyPaste: 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.readBoolOrNil(args.score), bestof == 0) local lines = Array.extend( @@ -45,4 +62,46 @@ 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=0', + 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/halo/match_group_input_custom.lua b/components/match2/wikis/halo/match_group_input_custom.lua index 1bbc699efb8..38fe416f9b0 100644 --- a/components/match2/wikis/halo/match_group_input_custom.lua +++ b/components/match2/wikis/halo/match_group_input_custom.lua @@ -8,6 +8,7 @@ local Array = require('Module:Array') local Lua = require('Module:Lua') +local Operator = require('Module:Operator') local Table = require('Module:Table') local Variables = require('Module:Variables') @@ -16,22 +17,24 @@ local OpponentLibrary = require('Module:OpponentLibraries') local Opponent = OpponentLibrary.Opponent local CustomMatchGroupInput = {} -local MatchFunctions = {} +local MatchFunctions = { + DEFAULT_MODE = 'team', +} local MapFunctions = {} - +local FfaMatchFunctions = { + DEFAULT_MODE = 'ffa', +} +local FfaMapFunctions = {} local DEFAULT_BESTOF = 3 -MatchFunctions.DEFAULT_MODE = 'team' ---@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 --- +-- "Mormal" match ---@param match table ---@param opponents table[] @@ -114,10 +117,6 @@ function MatchFunctions.getHeadToHeadLink(match, opponents) return buildQueryFormLink('Head2head', 'Headtohead', headtoheadArgs) end --- --- map related functions --- - ---@param match table ---@param map table ---@param opponents table[] @@ -130,4 +129,49 @@ 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/halo/match_summary_ffa.lua b/components/match2/wikis/halo/match_summary_ffa.lua new file mode 100644 index 00000000000..b3a0773bb6e --- /dev/null +++ b/components/match2/wikis/halo/match_summary_ffa.lua @@ -0,0 +1,44 @@ +--- +-- @Liquipedia +-- wiki=halo +-- 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 HaloFfaMatchGroupUtilMatch: MatchGroupUtilMatch +---@field games HaloFfaMatchGroupUtilGame[] + +---@param props {bracketId: string, matchId: string} +---@return Widget +function CustomMatchSummary.getByMatchId(props) + ---@class HaloFfaMatchGroupUtilMatch + 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