using System.Collections.Generic; using System.Linq; using LitJson; namespace Wizard; public class GatheringTournamentInfoTask : BaseTask { private class Match { public int MatchId; public int ParentMatchId; public int ParentMatchUserIndex; public int Status; public int ViewerId1; public int ViewerId2; public int WinnerViewerId; public int RoomId; public bool IsForceLose1; public bool IsForceLose2; public bool IsForceLoseWinner; public bool IsExtra; public bool IsFinalMatchReset; public bool IsActive { get { if (ViewerId1 > 0 && ViewerId2 > 0) { return WinnerViewerId == 0; } return false; } } } public List TournamentDataList { get; private set; } public GatheringTournamentInfoTask() { base.type = ApiType.Type.GatheringTournamentInfo; } protected override int Parse() { int num = base.Parse(); if (num != 1) { return num; } TournamentDataList = ParseTournamentDataList(base.ResponseData["data"]); return num; } private List ParseTournamentDataList(JsonData data) { if (data == null) { return null; } Dictionary userInfo = CollectUserInfo(data); List list = new List(); if (data.TryGetValue("1", out var value)) { list.Add(ParseTournamentData(value, isWinners: true, userInfo)); } if (data.TryGetValue("2", out var value2)) { list.Add(ParseTournamentData(value2, isWinners: false, userInfo)); } return list; } private TournamentData ParseTournamentData(JsonData data, bool isWinners, Dictionary userInfo) { Match[][] matches = ConvertToMatch(data); Dictionary cellMatchIdDict = new Dictionary(); TournamentData tournamentData = new TournamentData(); int num = matches.Length + 1; List list = (tournamentData.Rounds = new List(num)); for (int i = 0; i < num; i++) { TournamentRoundData item = new TournamentRoundData { RoundNo = i + 1, Cells = new List(), Watchs = new List() }; list.Add(item); } Match match = matches[matches.Length - 1][0]; TournamentCellData.CellState cellState = GetCellState(match, match.WinnerViewerId, match.IsForceLoseWinner); CreateCell(list[num - 1], match.WinnerViewerId, match.MatchId, cellState, isWinners).IsTerminal = true; int i2 = matches.Length - 1; while (i2 >= 0) { Match[] source = matches[i2]; TournamentRoundData tournamentRoundData = list[i2 + 1]; TournamentRoundData tournamentRoundData2 = list[i2]; foreach (TournamentCellData cell in tournamentRoundData.Cells) { if (cell == null || !cellMatchIdDict.ContainsKey(cell)) { continue; } int matchId = cellMatchIdDict[cell]; Match match2 = source.FirstOrDefault((Match m) => m.MatchId == matchId); TournamentCellData tournamentCellData = CreateCell(tournamentRoundData2, match2.ViewerId1, GetChildMatchId(1), GetCellState(match2, match2.ViewerId1, match2.IsForceLose1), isChampion: false); tournamentCellData.Line = TournamentCellData.LineType.Down; tournamentCellData.Parent = cell; tournamentCellData.IsFinalMatchReset = false; TournamentCellData tournamentCellData2 = CreateCell(tournamentRoundData2, match2.ViewerId2, GetChildMatchId(2), GetCellState(match2, match2.ViewerId2, match2.IsForceLose2), isChampion: false); tournamentCellData2.Line = TournamentCellData.LineType.Up; tournamentCellData2.Parent = cell; tournamentCellData2.IsFinalMatchReset = match2.IsFinalMatchReset; cell.Children = new TournamentCellData[2] { tournamentCellData, tournamentCellData2 }; tournamentRoundData2.IsExtraRound = match2.IsExtra; if (match2.RoomId > 0) { CreateWatch(tournamentRoundData2, match2); } if (match2.IsExtra) { i2--; match2 = matches[i2][0]; matchId = match2.MatchId; tournamentRoundData2 = list[i2]; tournamentCellData = CreateCell(tournamentRoundData2, match2.ViewerId1, GetChildMatchId(1), GetCellState(match2, match2.ViewerId1, match2.IsForceLose1), isChampion: false); tournamentCellData.Line = TournamentCellData.LineType.Down; tournamentCellData.IsPreExtra = true; tournamentCellData2 = CreateCell(tournamentRoundData2, match2.ViewerId2, GetChildMatchId(2), GetCellState(match2, match2.ViewerId2, match2.IsForceLose2), isChampion: false); tournamentCellData2.Line = TournamentCellData.LineType.Up; tournamentCellData2.IsPreExtra = true; if (match2.RoomId > 0) { CreateWatch(tournamentRoundData2, match2); } } int GetChildMatchId(int parentMatchUserIndex) { if (i2 == 0) { return 0; } return matches[i2 - 1].FirstOrDefault((Match m) => m.ParentMatchId == matchId && m.ParentMatchUserIndex == parentMatchUserIndex)?.MatchId ?? 0; } } int num2 = i2 - 1; i2 = num2; } return tournamentData; TournamentCellData CreateCell(TournamentRoundData round, int viewerId, int num3, TournamentCellData.CellState state, bool isChampion) { TournamentCellData tournamentCellData3 = new TournamentCellData { State = state }; (string, long) tuple = userInfo[viewerId]; tournamentCellData3.Name = tuple.Item1; tournamentCellData3.EmblemId = tuple.Item2; tournamentCellData3.ViewerId = viewerId; tournamentCellData3.IsChampion = isChampion; tournamentCellData3.Round = round; round.Cells.Add(tournamentCellData3); if (num3 > 0) { cellMatchIdDict.Add(tournamentCellData3, num3); } return tournamentCellData3; } static TournamentWatchData CreateWatch(TournamentRoundData round, Match match3) { TournamentWatchData tournamentWatchData = new TournamentWatchData { RoomId = match3.RoomId, ViewerId0 = match3.ViewerId1, ViewerId1 = match3.ViewerId2 }; round.Watchs.Add(tournamentWatchData); return tournamentWatchData; } } private TournamentCellData.CellState GetCellState(Match match, int viewerId, bool isForceLose) { if (isForceLose) { if (viewerId != 0) { return TournamentCellData.CellState.LoseByDefault; } return TournamentCellData.CellState.Blank; } if (match.Status == 5) { if (viewerId == 0) { return TournamentCellData.CellState.LoseByDefault; } if (match.WinnerViewerId != viewerId) { return TournamentCellData.CellState.Lose; } return TournamentCellData.CellState.Win; } if (viewerId == 0) { return TournamentCellData.CellState.Blank; } if (match.IsActive) { return TournamentCellData.CellState.Active; } return TournamentCellData.CellState.Unresolved; } private Dictionary CollectUserInfo(JsonData data) { Dictionary dictionary = new Dictionary { { 0, (string.Empty, 0L) } }; foreach (string key2 in data.Keys) { JsonData jsonData = data[key2]; foreach (string key3 in jsonData.Keys) { JsonData jsonData2 = jsonData[key3]; for (int i = 0; i < jsonData2.Count; i++) { JsonData jsonData3 = jsonData2[i]; Add(jsonData3["user1"], dictionary); Add(jsonData3["user2"], dictionary); } } } return dictionary; static void Add(JsonData userData, Dictionary dict) { if (userData != null) { int key = userData["viewer_id"].ToInt(); if (!dict.ContainsKey(key)) { string item = userData["name"].ToString(); long item2 = userData["emblem_id"].ToLong(); dict.Add(key, (item, item2)); } } } } private Match[][] ConvertToMatch(JsonData data) { Match[][] array = new Match[data.Count][]; for (int i = 0; i < data.Count; i++) { JsonData jsonData = data[(i + 1).ToString()]; Match[] array2 = new Match[jsonData.Count]; for (int j = 0; j < jsonData.Count; j++) { JsonData jsonData2 = jsonData[j]; bool isFinalMatchReset = false; if (jsonData2.TryGetValue("is_show_one_more_win", out var value)) { isFinalMatchReset = value.ToInt() == 1; } Match match = new Match { MatchId = jsonData2["matching_id"].ToInt(), ParentMatchId = jsonData2["winner_parent_matching_id"].ToInt(), ParentMatchUserIndex = jsonData2["winner_parent_matching_viewer_id_suffix"].ToInt(), Status = jsonData2["status"].ToInt(), ViewerId1 = jsonData2["viewer_id1"].ToInt(), ViewerId2 = jsonData2["viewer_id2"].ToInt(), WinnerViewerId = jsonData2["winner_viewer_id"].ToInt(), RoomId = jsonData2["display_room_id"].ToInt(), IsForceLose1 = (jsonData2["is_force_lose1"].ToInt() == 1), IsForceLose2 = (jsonData2["is_force_lose2"].ToInt() == 1), IsExtra = (jsonData2["side_type"].ToInt() == 3), IsFinalMatchReset = isFinalMatchReset }; match.IsForceLoseWinner = ((match.ViewerId1 == match.WinnerViewerId) ? match.IsForceLose1 : match.IsForceLose2); array2[j] = match; } array[i] = array2; } return array; } }