diff --git a/lua/wikis/deltaforce/GetMatchGroupCopyPaste/wiki.lua b/lua/wikis/deltaforce/GetMatchGroupCopyPaste/wiki.lua new file mode 100644 index 00000000000..2a5d831db7d --- /dev/null +++ b/lua/wikis/deltaforce/GetMatchGroupCopyPaste/wiki.lua @@ -0,0 +1,87 @@ +--- +-- @Liquipedia +-- page=Module:GetMatchGroupCopyPaste/wiki +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local Lua = require('Module:Lua') + +local Array = Lua.import('Module:Array') +local Class = Lua.import('Module:Class') +local Logic = Lua.import('Module:Logic') + +local BaseCopyPaste = Lua.import('Module:GetMatchGroupCopyPaste/wiki/Base') + +---@class DeltaForceMatch2CopyPaste: Match2CopyPasteBase +local WikiCopyPaste = Class.new(BaseCopyPaste) + +local INDENT = WikiCopyPaste.Indent + +--returns the Code for a Match, depending on the input +---@param bestof integer +---@param mode string +---@param index integer +---@param opponents integer +---@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) + + local lines = Array.extendWith({}, + '{{Match', + index == 1 and (INDENT .. '|bestof=' .. (bestof ~= 0 and bestof or '')) or nil, + Logic.readBool(args.needsWinner) and (INDENT .. '|winner=') or nil, + INDENT .. '|date=', + Logic.readBool(args.streams) and (INDENT .. '|twitch=|youtube=|vod=') or nil, + Array.map(Array.range(1, opponents), function(opponentIndex) + return INDENT .. '|opponent' .. opponentIndex .. '=' .. opponent + end), + bestof ~= 0 and Array.map(Array.range(1, bestof), function(mapIndex) + return INDENT .. '|map' .. mapIndex .. '={{Map|map=|score1=|score2=|winner=}}' + end) or nil, + INDENT .. '}}' + ) + + 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' .. + 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 + +return WikiCopyPaste diff --git a/lua/wikis/deltaforce/MatchGroup/Input/Custom.lua b/lua/wikis/deltaforce/MatchGroup/Input/Custom.lua new file mode 100644 index 00000000000..d1aeb41c537 --- /dev/null +++ b/lua/wikis/deltaforce/MatchGroup/Input/Custom.lua @@ -0,0 +1,77 @@ +--- +-- @Liquipedia +-- page=Module:MatchGroup/Input/Custom +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local Lua = require('Module:Lua') + +local Array = Lua.import('Module:Array') +local FnUtil = Lua.import('Module:FnUtil') +local Operator = Lua.import('Module:Operator') + +local MatchGroupInputUtil = Lua.import('Module:MatchGroup/Input/Util') + +local CustomMatchGroupInput = {} + +---@class DeltaForceMatchParser: MatchParserInterface +local MatchFunctions = { + DEFAULT_MODE = 'team', + getBestOf = MatchGroupInputUtil.getBestOf, +} + +---@class DeltaForceMapParser: MapParserInterface +local MapFunctions = {} + +---@class DeltaForceFfaMatchParser: FfaMatchParserInterface +local FfaMatchFunctions = { + DEFAULT_MODE = 'team', +} + +---@class DeltaForceFfaMapParser: FfaMapParserInterface +local FfaMapFunctions = {} + +---@param match table +---@param options table? +---@return table +function CustomMatchGroupInput.processMatch(match, options) + return MatchGroupInputUtil.standardProcessMatch(match, MatchFunctions, FfaMatchFunctions) +end + +-- "Normal" match +---@param match table +---@param opponents MGIParsedOpponent[] +---@return table[] +function MatchFunctions.extractMaps(match, opponents) + return MatchGroupInputUtil.standardProcessMaps(match, opponents, MapFunctions) +end + +---@param maps table[] +---@return fun(opponentIndex: integer): integer? +function MatchFunctions.calculateMatchScore(maps) + return FnUtil.curry(MatchGroupInputUtil.computeMatchScoreFromMapWinners, maps) +end + +--- FFA Match + +---@param match table +---@param opponents MGIParsedOpponent[] +---@param scoreSettings table +---@return table[] +function FfaMatchFunctions.extractMaps(match, opponents, scoreSettings) + return MatchGroupInputUtil.standardProcessFfaMaps(match, opponents, scoreSettings, FfaMapFunctions) +end + +---@param opponents MGIParsedOpponent[] +---@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 + +return CustomMatchGroupInput diff --git a/lua/wikis/deltaforce/MatchSummary.lua b/lua/wikis/deltaforce/MatchSummary.lua new file mode 100644 index 00000000000..60911d3df58 --- /dev/null +++ b/lua/wikis/deltaforce/MatchSummary.lua @@ -0,0 +1,46 @@ +--- +-- @Liquipedia +-- page=Module:MatchSummary +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local Lua = require('Module:Lua') + +local DisplayHelper = Lua.import('Module:MatchGroup/Display/Helper') +local MatchSummary = Lua.import('Module:MatchSummary/Base') +local MatchSummaryWidgets = Lua.import('Module:Widget/Match/Summary/All') +local WidgetUtil = Lua.import('Module:Widget/Util') + +local CustomMatchSummary = {} + +---@param args table +---@return Widget +function CustomMatchSummary.getByMatchId(args) + return MatchSummary.defaultGetByMatchId(CustomMatchSummary, args) +end + +---@param date string +---@param game MatchGroupUtilGame +---@param gameIndex integer +---@return Widget? +function CustomMatchSummary.createGame(date, game, gameIndex) + local function makeTeamSection(opponentIndex) + return { + MatchSummaryWidgets.GameWinLossIndicator{winner = game.winner, opponentIndex = opponentIndex}, + DisplayHelper.MapScore(game.opponents[opponentIndex], game.status) + } + end + + return MatchSummaryWidgets.Row{ + classes = {'brkts-popup-body-game'}, + children = WidgetUtil.collect( + MatchSummaryWidgets.GameTeamWrapper{children = makeTeamSection(1)}, + MatchSummaryWidgets.GameCenter{children = DisplayHelper.Map(game)}, + MatchSummaryWidgets.GameTeamWrapper{children = makeTeamSection(2), flipped = true}, + MatchSummaryWidgets.GameComment{children = game.comment} + ) + } +end + +return CustomMatchSummary diff --git a/lua/wikis/deltaforce/MatchSummary/Ffa.lua b/lua/wikis/deltaforce/MatchSummary/Ffa.lua new file mode 100644 index 00000000000..a3f072070c2 --- /dev/null +++ b/lua/wikis/deltaforce/MatchSummary/Ffa.lua @@ -0,0 +1,42 @@ +--- +-- @Liquipedia +-- 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/Custom') +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') +local WidgetUtil = Lua.import('Module:Widget/Util') + +---@param props {bracketId: string, matchId: string} +---@return Widget +function CustomMatchSummary.getByMatchId(props) + ---@class FFAMatchGroupUtilMatch + 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 = WidgetUtil.collect( + MatchSummaryWidgets.GamesSchedule{match = match}, + MatchSummaryWidgets.PointsDistribution{scores = scoringData}, + MatchSummaryWidgets.MatchInformation(match), + SummaryHelper.standardMatch(match) + ) + } + }} +end + +return CustomMatchSummary