diff --git a/screens/about/index.tsx b/screens/about/index.tsx index 44af887e..41fd715d 100644 --- a/screens/about/index.tsx +++ b/screens/about/index.tsx @@ -60,6 +60,143 @@ const BugReports = () => { ); }; +const Statistics = () => { + return ( + <> + Data Scraping +
  • Tracking only "automatch" matches.
  • +
  • Tracking only matches where at least one player is ranked in the leaderboards.
  • + See Data source article bellow for more details. + + ELO Filtering +
  • + You can filter by single ELO group like{" "} + + this + +
  • +
  • + You can filter by combining multiple ELO groups like{" "} + + this + +
  • + It's recommended to combine multiple ELO groups to get more data for you analysis. Keep in + mind that you need thousands of games to get meaningful results. + + Average Group Filter + <> + Average ELO of all players fit in the specified group. +
  • + + Good + {" "} + - a lot of games can fit into the group. +
  • +
  • + + {" "} + Bad + {" "} + - the game might not be balanced, it can be team A 1100 ELO vs Team B 1600 ELO. +
  • + Formula: + + Sum ELO of all players in match divided by number of players. + + + + Average Fair Matchup Filter + <> + + Average ELO of all players fit in the specified group while the difference between the + teams ELO is bellow 20% + +
  • + + Good + {" "} + - provides balanced games with more games to analyze. Useful for 3v3 and 4v4 +
  • +
  • + + {" "} + Bad + {" "} + - the team itself might not be balanced. Team A can have player with 1600 and 800 ELO + resulting in the average ELO of 1200 of team A. +
  • + Formula: + + Calculate average ELO of team A and team B. The difference between the ELO of the team A + and B is less than 20%. + + + + Average Excluded Group + <> + + Average ELO of all players fit in the specified group while the difference between the + lowest ELO and highest ELO player is less then 400. + +
  • + + Good + {" "} + - provides balanced games +
  • +
  • + + {" "} + Bad + {" "} + - less games can fit into this group. Very low matches in mode 3v3 and 4v4 can fit into + this group. +
  • + Formula: + + Sum ELO of all players in match divided by number of players to get match ELO. The + difference between the lowest ELO and highest ELO player is less then 400. + + + + Limit Group + <> + + Average ELO of all players fit in the specified group while the difference between the + lowest ELO and highest ELO player is less then 400. + +
  • + + Good + {" "} + - should provide the most balanced games +
  • +
  • + + {" "} + Bad + {" "} + - very low matches fit. Unusable for 3v3 and 4v4. +
  • + Formula: + + All players in the match has to fit into the specified group. The difference between the + lowest ELO and highest ELO player is less then 400. + + + + ); +}; + const keywords = generateKeywordsString(["coh3 stats", "coh3 discord", "bug report", "github"]); const sections = [ @@ -70,6 +207,12 @@ const sections = [ pageDisplayName: "Bug Reports, Feature Request and Contributions", component: , }, + { + name: "stats", + menuDisplayName: "Statistics", + pageDisplayName: "Game Statistics", + component: , + }, { name: "data", menuDisplayName: "Data", diff --git a/screens/stats/stats-container-selector.tsx b/screens/stats/stats-container-selector.tsx index 71304478..e3416c8d 100644 --- a/screens/stats/stats-container-selector.tsx +++ b/screens/stats/stats-container-selector.tsx @@ -7,9 +7,11 @@ import { AnalyticsMapStatsPageView, } from "../../src/firebase/analytics"; import { + Anchor, Button, Container, Flex, + HoverCard, MultiSelect, SegmentedControl, Select, @@ -29,7 +31,8 @@ import config from "../../config"; import InnerGameStatsPage from "./game/inner-game-stats-page"; import InnerMapsStatsPage from "./maps/inner-maps-stats-page"; import { analysisFilterType, analysisMapFilterType } from "../../src/analysis-types"; -import HelperIcon from "../../components/icon/helper"; +import { IconInfoCircle } from "@tabler/icons-react"; +import { getAboutRoute } from "../../src/routes"; const patchSelectorData = getPatchVersionAsMantineV7Groups(); @@ -250,6 +253,41 @@ const StatsContainerSelector = ({ statsType }: { statsType: "gameStats" | "mapSt }, ], }, + { + group: "Average Fair Matchup", + items: [ + { + value: `${statsType === "gameStats" ? "stats" : "mapStats"}-fair-1600-9999`, + label: "Average Fair 1600+", + disabled: disabledMultiFilter.averageDisabled, + }, + { + value: `${statsType === "gameStats" ? "stats" : "mapStats"}-fair-1400-1599`, + label: "Average Fair 1400-1599", + disabled: disabledMultiFilter.averageDisabled, + }, + { + value: `${statsType === "gameStats" ? "stats" : "mapStats"}-fair-1250-1399`, + label: "Average Fair 1250-1399", + disabled: disabledMultiFilter.averageDisabled, + }, + { + value: `${statsType === "gameStats" ? "stats" : "mapStats"}-fair-1100-1249`, + label: "Average Fair 1100-1249", + disabled: disabledMultiFilter.averageDisabled, + }, + { + value: `${statsType === "gameStats" ? "stats" : "mapStats"}-fair-800-1099`, + label: "Average Fair 800-1099", + disabled: disabledMultiFilter.averageDisabled, + }, + { + value: `${statsType === "gameStats" ? "stats" : "mapStats"}-fair-0-799`, + label: "Average Fair 0-799", + disabled: disabledMultiFilter.averageDisabled, + }, + ], + }, { group: "Average Ex 400 diff", items: [ @@ -355,12 +393,23 @@ const StatsContainerSelector = ({ statsType }: { statsType: "gameStats" | "mapSt withCheckIcon={false} label={ <> - ELO Filter{" "} - + + +
    + ELO Filter +
    +
    + + + + Learn more about Stats and ELO Filters + +
    Average Group - Average ELO of all players fit in the specified group
    + Average Fair Matchup - Average ELO of all players fit in the + specified group while the difference between the teams ELO is bellow 20% +
    Average Excluded Group - Average ELO of all players fit into specified group while the difference between the lowest ELO player and highest ELO player in the match is bellow 400 @@ -368,10 +417,8 @@ const StatsContainerSelector = ({ statsType }: { statsType: "gameStats" | "mapSt Limit Group - ELO of all players in the match must fit into specified group
    - } - iconSize={18} - position={"bottom"} - /> +
    +
    } defaultValue="all" diff --git a/src/analysis-types.ts b/src/analysis-types.ts index 7534c12f..b2535afb 100644 --- a/src/analysis-types.ts +++ b/src/analysis-types.ts @@ -33,6 +33,12 @@ export const analysisFilterTypeArray = [ "stats-average-ex-1250-1399", "stats-average-ex-1400-1599", "stats-average-ex-1600-9999", + "stats-fair-0-799", + "stats-fair-800-1099", + "stats-fair-1100-1249", + "stats-fair-1250-1399", + "stats-fair-1400-1599", + "stats-fair-1600-9999", ] as const; export type analysisFilterType = (typeof analysisFilterTypeArray)[number]; @@ -57,6 +63,12 @@ export const analysisMapFilterTypeArray = [ "mapStats-average-ex-1250-1399", "mapStats-average-ex-1400-1599", "mapStats-average-ex-1600-9999", + "mapStats-fair-0-799", + "mapStats-fair-800-1099", + "mapStats-fair-1100-1249", + "mapStats-fair-1250-1399", + "mapStats-fair-1400-1599", + "mapStats-fair-1600-9999", ] as const; export type analysisMapFilterType = (typeof analysisMapFilterTypeArray)[number]; diff --git a/src/routes.ts b/src/routes.ts index 577475b8..c1059dec 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -87,7 +87,11 @@ export const getDesktopAppRoute = () => { return encodeURI(`/desktop-app`); }; -export const getAboutRoute = () => { +export const getAboutRoute = (section?: string) => { + if (section) { + return encodeURI(`/about#${section}`); + } + return encodeURI(`/about`); };