Модуль:PlayerStats/doc: различия между версиями
Нет описания правки |
Нет описания правки |
||
| Строка 1: | Строка 1: | ||
{{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}</includeonly> | {{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}</includeonly> | ||
== | == Общее описание == | ||
[[Module:PlayerStats]] — это центральный контроллер (точка входа) для генерации полной личной страницы игрока [[ЧТМ]]. Модуль собирает абсолютно всю статистику по игроку за все годы, высчитывает достижения, [[Индивидуальные рекорды ЧТМ|рекорды]], [[мегарейтинг]], медали, строит навигационные шаблоны и хронологию матчей. | |||
* | |||
* [[ЧТМ:PlayerStats/ | Главное достижение системы — скорость работы. Вместо того чтобы каждый блок (таблицы, медали, рекорды) заново перебирал базу данных, система делает один-единственный проход по [[Модуль:Data|базам данных]] всех лет через движок {{Модуль|StatEngine/Pure}} (Харвестер). Все данные кэшируются в гигантский словарь <code>GrandStats</code>, откуда интерфейсные модули мгновенно забирают нужные цифры. | ||
== Использование == | |||
На странице игрока (например, [[Диман]]) модуль вызывается через шаблон (или напрямую через <code>#invoke</code>): | |||
<syntaxhighlight lang="wikitext" line> | |||
{{#invoke:PlayerStats|main|Диман}} | |||
</syntaxhighlight> | |||
Или с указанием параметров: | |||
<syntaxhighlight lang="wikitext" line> | |||
{{#invoke:PlayerStats|main|Диман | |||
|main_table = yes | |||
|achievements = yes | |||
|matches_list = yes | |||
|navboxes = yes | |||
|medals = yes | |||
}} | |||
</syntaxhighlight> | |||
=== Параметры вызова === | |||
<markdown>* `1` или `player` или `игрок` **(Обязательный)**: Точное имя игрока так, как оно записано в базах данных (например, `Диман`, `Диман Е.`, `Макс`). | |||
* `main_table`: Показывать ли главную сводную таблицу статистики? (`yes` / `no`, по умолчанию `yes`). | |||
* `achievements`: Вычислять и показывать ли блок «Достижения и Рекорды»? (`yes` / `no`, по умолчанию `yes`). | |||
* `matches_list`: Показывать ли хронологический список всех матчей игрока начиная с [[ЧТМ-2022]]? (`yes` / `no`, по умолчанию `yes`). | |||
* `navboxes`: Генерировать ли навигационные шаблоны (Чемпионские списки, Клуб 100, призы)? (`yes` / `no`, по умолчанию `yes`). | |||
* `medals`: Раскрашивать ли ячейки в таблице статистики (золото, серебро, бронза, дерево) за лидерство в конкретном году и историческом зачёте? (`yes` / `no`, по умолчанию `no`).</markdown> | |||
== Архитектура системы == | |||
Система разделена на независимые слои, как в классическом MVC (Model-View-Controller). | |||
; Слой 1: Базы Данных (Data) | |||
* [[Module:Data/2006]] ... [[Module:Data/2046]]: Сырые массивы матчей. Никакой логики, только факты (кто играл, кто забил, минуты, пенальти). | |||
* [[Module:Data/Teams]]: Справочник команд (коды, полные названия, падежи). | |||
; Слой 2: Настройки и Правила (Config) | |||
* [[Module:Config]]: Мозг проекта. Здесь лежат списки годов, массивы чемпионов, цвета для таблиц, параметры эпох (с какого года считается статистика), а также «Костыли» (ручные корректировки вроде +11 к полезности для отдельного матча). | |||
; Слой 3: Вычислительные движки (Engines) | |||
* [[Module:StatEngine/Pure]] (Харвестер): Математик. Берет сырые базы и перемалывает их в готовую статистику (голы, мега-трики, матчи на ноль). Ничего не знает про интерфейс. | |||
* [[Module:StatEngine/TournamentAwards]]: Логика судейства (кто получил [[Башмак]], кто [[MVP игрового дня]], как разрешать равенство очков). | |||
* [[Module:Megarating]]: Сложный калькулятор [[мегарейтинг]]а по формулам ЧТМ (награждение очками, тайбрейкеры). | |||
; Слой 4: Контроллер (PlayerStats) | |||
Сам [[Module:PlayerStats]]. Его задачи по порядку: | |||
# Подгрузить все БД. | |||
# Прогнать всё через Харвестер и получить <code>GrandStats</code>. | |||
# Применить ручные добавки из <code>Config.award_adjustments</code>. | |||
# Сделать линейный проход по плоскому списку матчей <code>flat_matches</code> для расчёта последовательностей (серии побед, паузы между матчами, сухие серии) с помощью <code>StreaksCore</code>. | |||
# Посчитать медали по годам (учитывая лимиты: минимум 20 матчей в поле или 5 в воротах для средних показателей). | |||
# Отдать готовые данные на отрисовку. | |||
; Слой 5: Интерфейс (UI View) | |||
* [[Module:PlayerAchievements]]: Строит маркированные списки текстовых достижений и рекордов. | |||
* [[Module:Автоматическая статистика]]: Рисует таблицу по годам и сворачиваемый список матчей. | |||
== Инструкция по поддержке и обслуживанию == | |||
Поскольку система написана модульно, вам почти никогда не придется лезть в математику (`StatEngine`) или в контроллер (`PlayerStats`). Все изменения делаются в конфигурациях. | |||
<markdown>### Как добавить новый турнир (например, ЧТМ-2050): | |||
1. Создайте модуль **`Module:Data/2050`** и заливайте туда матчи. | |||
2. Откройте **`Module:Config`**: | |||
* Добавьте `2050` в `Config.years` и `Config.all_years`. | |||
* Если турнир не закончен, поставьте `Config.is_latest_finished = false`. Как только сыгран финал — меняйте на `true`. | |||
* Пропишите чемпионов в `Config.champions_teams` и `Config.champions_players` (когда они станут известны). | |||
3. **ВСЁ.** Система автоматически начнет считать статистику 2050 года, добавит новые колонки в таблицы и обновит все медали и мегарейтинг. | |||
### Как скорректировать статистику (например, забытые голы или полезность): | |||
Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код: | |||
1. Зайдите в **`Module:Config`**. | |||
2. В массиве `Config.metrics` найдите нужный показатель (например, `clearances` или `head_goals`). | |||
3. Добавьте игрока в секцию `adjustments -> players`:</markdown> | |||
<syntaxhighlight lang="lua" line> | |||
["clearances"] = { | |||
start = 2022, | |||
get_val = function(stats) return stats.clearances end, | |||
adjustments = { | |||
players = { | |||
["Имя_Игрока"] = { [2050] = 5 }, -- Добавит 5 выносов в 2050 году | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<markdown>Модуль `PlayerStats` сам подхватит эти цифры, плюсанет их в общую историю и в конкретный год. | |||
### Что делать, если появляется новый показатель? | |||
Если в 2050 году вы решите считать, например, «Голы с центра поля»: | |||
1. В `StatEngine/Pure` в `create_empty_stats` добавьте поле `center_goals = 0`. | |||
2. Там же в `extract_goals` пропишите `if goal.goal_type == "с центра" then p.goals.center_goals = ... end`. | |||
3. В `Config` в `Config.metrics` создайте словарь `["center_goals"]`. | |||
4. В `Module:Автоматическая статистика` добавьте строчку в `p.row_defs`.</markdown> | |||
---- | ---- | ||
<includeonly>''Пожалуйста, добавляйте категории на страницу [[/doc|документации]]''.</includeonly>{{Doc/end}} | <includeonly>''Пожалуйста, добавляйте категории на страницу [[/doc|документации]]''.</includeonly>{{Doc/end}} | ||
Версия от 05:53, 4 июня 2026
Общее описание
Module:PlayerStats — это центральный контроллер (точка входа) для генерации полной личной страницы игрока ЧТМ. Модуль собирает абсолютно всю статистику по игроку за все годы, высчитывает достижения, рекорды, мегарейтинг, медали, строит навигационные шаблоны и хронологию матчей.
Главное достижение системы — скорость работы. Вместо того чтобы каждый блок (таблицы, медали, рекорды) заново перебирал базу данных, система делает один-единственный проход по базам данных всех лет через движок StatEngine/Pure (Харвестер). Все данные кэшируются в гигантский словарь GrandStats, откуда интерфейсные модули мгновенно забирают нужные цифры.
Использование
На странице игрока (например, Диман) модуль вызывается через шаблон (или напрямую через #invoke):
{{#invoke:PlayerStats|main|Диман}}
Или с указанием параметров:
{{#invoke:PlayerStats|main|Диман
|main_table = yes
|achievements = yes
|matches_list = yes
|navboxes = yes
|medals = yes
}}
Параметры вызова
1илиplayerилиигрок(Обязательный): Точное имя игрока так, как оно записано в базах данных (например,Диман,Диман Е.,Макс).main_table: Показывать ли главную сводную таблицу статистики? (yes/no, по умолчаниюyes).achievements: Вычислять и показывать ли блок «Достижения и Рекорды»? (yes/no, по умолчаниюyes).matches_list: Показывать ли хронологический список всех матчей игрока начиная с [[ЧТМ-2022]]? (yes/no, по умолчаниюyes).navboxes: Генерировать ли навигационные шаблоны (Чемпионские списки, Клуб 100, призы)? (yes/no, по умолчаниюyes).medals: Раскрашивать ли ячейки в таблице статистики (золото, серебро, бронза, дерево) за лидерство в конкретном году и историческом зачёте? (yes/no, по умолчаниюno).
Архитектура системы
Система разделена на независимые слои, как в классическом MVC (Model-View-Controller).
- Слой 1
- Базы Данных (Data)
- Module:Data/2006 ... Module:Data/2046: Сырые массивы матчей. Никакой логики, только факты (кто играл, кто забил, минуты, пенальти).
- Module:Data/Teams: Справочник команд (коды, полные названия, падежи).
- Слой 2
- Настройки и Правила (Config)
- Module:Config: Мозг проекта. Здесь лежат списки годов, массивы чемпионов, цвета для таблиц, параметры эпох (с какого года считается статистика), а также «Костыли» (ручные корректировки вроде +11 к полезности для отдельного матча).
- Слой 3
- Вычислительные движки (Engines)
- Module:StatEngine/Pure (Харвестер): Математик. Берет сырые базы и перемалывает их в готовую статистику (голы, мега-трики, матчи на ноль). Ничего не знает про интерфейс.
- Module:StatEngine/TournamentAwards: Логика судейства (кто получил Башмак, кто MVP игрового дня, как разрешать равенство очков).
- Module:Megarating: Сложный калькулятор мегарейтинга по формулам ЧТМ (награждение очками, тайбрейкеры).
- Слой 4
- Контроллер (PlayerStats)
Сам Module:PlayerStats. Его задачи по порядку:
- Подгрузить все БД.
- Прогнать всё через Харвестер и получить
GrandStats. - Применить ручные добавки из
Config.award_adjustments. - Сделать линейный проход по плоскому списку матчей
flat_matchesдля расчёта последовательностей (серии побед, паузы между матчами, сухие серии) с помощьюStreaksCore. - Посчитать медали по годам (учитывая лимиты: минимум 20 матчей в поле или 5 в воротах для средних показателей).
- Отдать готовые данные на отрисовку.
- Слой 5
- Интерфейс (UI View)
- Module:PlayerAchievements: Строит маркированные списки текстовых достижений и рекордов.
- Module:Автоматическая статистика: Рисует таблицу по годам и сворачиваемый список матчей.
Инструкция по поддержке и обслуживанию
Поскольку система написана модульно, вам почти никогда не придется лезть в математику (`StatEngine`) или в контроллер (`PlayerStats`). Все изменения делаются в конфигурациях.
Как добавить новый турнир (например, ЧТМ-2050):
- Создайте модуль
Module:Data/2050и заливайте туда матчи. - Откройте
Module:Config:- Добавьте
2050вConfig.yearsиConfig.all_years. - Если турнир не закончен, поставьте
Config.is_latest_finished = false. Как только сыгран финал — меняйте наtrue. - Пропишите чемпионов в
Config.champions_teamsиConfig.champions_players(когда они станут известны).
- Добавьте
- ВСЁ. Система автоматически начнет считать статистику 2050 года, добавит новые колонки в таблицы и обновит все медали и мегарейтинг.
Как скорректировать статистику (например, забытые голы или полезность):
Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код:
- Зайдите в
Module:Config. - В массиве
Config.metricsнайдите нужный показатель (например,clearancesилиhead_goals). - Добавьте игрока в секцию
adjustments -> players:
["clearances"] = {
start = 2022,
get_val = function(stats) return stats.clearances end,
adjustments = {
players = {
["Имя_Игрока"] = { [2050] = 5 }, -- Добавит 5 выносов в 2050 году
}
}
}
Модуль PlayerStats сам подхватит эти цифры, плюсанет их в общую историю и в конкретный год.
Что делать, если появляется новый показатель?
Если в 2050 году вы решите считать, например, «Голы с центра поля»:
- В
StatEngine/Pureвcreate_empty_statsдобавьте полеcenter_goals = 0. - Там же в
extract_goalsпропишитеif goal.goal_type == "с центра" then p.goals.center_goals = ... end. - В
ConfigвConfig.metricsсоздайте словарь["center_goals"]. - В
Module:Автоматическая статистикадобавьте строчку вp.row_defs.