Модуль:Config: различия между версиями
м Защитил страницу Модуль:Config ([Переименование=Максимальная защита страницы] (бессрочно)) |
Lord (обсуждение | вклад) Нет описания правки |
||
| (не показано 16 промежуточных версий 4 участников) | |||
| Строка 9: | Строка 9: | ||
-- ========================================================= | -- ========================================================= | ||
-- Добавите сюда 2050 год — и он автоматически появится во всех таблицах на сайте. | -- Добавите сюда 2050 год — и он автоматически появится во всех таблицах на сайте. | ||
-- Нужны два разных массива для двух разных БД. | |||
-- Только годы финальных турниров ЧТМ (для Data/2006, Data/2010 и т. д.): | |||
Config.years = {2006, 2010, 2014, 2018, 2022, 2026, 2030, 2034, 2038, 2042, 2046} | Config.years = {2006, 2010, 2014, 2018, 2022, 2026, 2030, 2034, 2038, 2042, 2046} | ||
Config.is_latest_finished = | Config.is_latest_finished = true -- Флаг: завершён ли последний ЧТМ в списке? | ||
Config.rating_year = | |||
-- Все годы, в которые проходил хотя бы один любой турнир (для Data/Tournaments/2006 и т. д.): | |||
Config.all_years = {2006, 2009, 2010, 2013, 2014, 2015, 2017, 2018, 2019, 2020, 2021, | |||
2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, | |||
2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, | |||
2044, 2045, 2046, 2047, 2048} | |||
Config.rating_year = 2046 -- до какого года подсчитывается актуальный рейтинг | |||
Config.champions_teams = { -- быстрый список чемпионов, чтобы не шарить по всей БД каждый раз | Config.champions_teams = { -- быстрый список чемпионов, чтобы не шарить по всей БД каждый раз | ||
[2006] = "МОН", -- Монголия | [2006] = "МОН", -- Монголия | ||
| Строка 23: | Строка 31: | ||
[2038] = "КИР", -- Киргизия | [2038] = "КИР", -- Киргизия | ||
[2042] = "ИНД", -- Индия | [2042] = "ИНД", -- Индия | ||
[2046] = "КИР", -- Киргизия | |||
-- Каждая команда имеет свой трёхбуквенный код, прописанный в Модуль:Data/Teams | -- Каждая команда имеет свой трёхбуквенный код, прописанный в Модуль:Data/Teams | ||
} | } | ||
| Строка 38: | Строка 47: | ||
[2038] = {"Алишер", "Антон", "Геныч", "Дима Кес.", "Лёха", "Макс"}, | [2038] = {"Алишер", "Антон", "Геныч", "Дима Кес.", "Лёха", "Макс"}, | ||
[2042] = {"Геныч", "Диман", "Некит", "Ринат", "Серёга"}, | [2042] = {"Геныч", "Диман", "Некит", "Ринат", "Серёга"}, | ||
[2046] = {"Бирюк", "Геныч", "Диман", "Коля", "Серёга"}, | |||
} | } | ||
| Строка 43: | Строка 53: | ||
-- 2. РУЧНОЙ КОНТРОЛЬ АКТИВНЫХ КОМАНД (КОСТЫЛЬ) | -- 2. РУЧНОЙ КОНТРОЛЬ АКТИВНЫХ КОМАНД (КОСТЫЛЬ) | ||
-- ========================================================= | -- ========================================================= | ||
-- Сюда вписываются команды, которые продолжают выступления на текущем ЧТМ | --[[ | ||
Сюда вписываются команды, которые продолжают выступления на текущем ЧТМ, | |||
Config.active_teams_list = { | чтобы не писать сложнейшие алгоритмы для группового раунда | ||
--]] | |||
Config.active_teams_list = {} | |||
-- Технический словарь для моментального поиска | -- Технический словарь для моментального поиска | ||
| Строка 122: | Строка 134: | ||
cards = 2038 | cards = 2038 | ||
} | } | ||
-- Обычно все подсчёты идут именно с указанных годов. | --[[ | ||
Обычно все подсчёты идут именно с указанных годов. | |||
Но есть одно важнейшее исключение: | |||
Несмотря на эти цифры, абсолютно во всех финальных матчах | |||
известны все составы и ассистенты. Как правило, в общую | |||
статистику эти показатели не входят, но когда подсчитывается | |||
что-то связанное именно с финалами или чемпионскими титулами, | |||
то их тоже надо считать. Поэтому когда создаются алгоритмы подсчёта | |||
для чего-то, связанного с финалами, то ни в коем случае не надо | |||
связывать подсчёты с сыгранными матчами, иначе показатели финалов | |||
с 2006 до 2018 не попадут в статистику. | |||
--]] | |||
-- ========================================================= | -- ========================================================= | ||
| Строка 156: | Строка 170: | ||
["own_goals"] = { start = 2006, anti_prize = true, get_val = function(stats) return stats.own_goals end }, | ["own_goals"] = { start = 2006, anti_prize = true, get_val = function(stats) return stats.own_goals end }, | ||
["head_goals"] | ["head_goals"] = { -- не записывались в конкретных матчах на ЧТМ-2022 и ЧТМ-2026, | ||
["heel_goals"] | -- а просто подсчитывались суммарно | ||
start = 2022, | |||
get_val = function(stats) return stats.goals.head end, | |||
adjustments = { | |||
players = { | |||
["Диман"] = { [2022] = 3, [2026] = 4 }, | |||
["Антон"] = { [2026] = 1 }, | |||
["Макс"] = { [2026] = 1 }, | |||
} | |||
} | |||
}, | |||
["heel_goals"] = { -- не записывались в конкретных матчах на ЧТМ-2026, | |||
-- а просто подсчитывались суммарно | |||
start = 2026, | |||
get_val = function(stats) return stats.goals.heel end, | |||
adjustments = { | |||
players = { | |||
["Геныч"] = { [2026] = 2 }, | |||
["Макс"] = { [2026] = 1 }, | |||
["Серёга"] = { [2026] = 1 }, | |||
} | |||
} | |||
}, | |||
["free_kick_goals"] = { start = 2026, get_val = function(stats) return stats.goals.free_kick end }, | ["free_kick_goals"] = { start = 2026, get_val = function(stats) return stats.goals.free_kick end }, | ||
["goalie_goals"] = { start = 2022, get_val = function(stats) return stats.goals.goalie end }, | ["goalie_goals"] = { start = 2022, get_val = function(stats) return stats.goals.goalie end }, | ||
| Строка 168: | Строка 204: | ||
}, | }, | ||
["assist_mega_tricks"] = { start = 2026, get_val = function(stats) return stats.assists.hat_trick + stats.assists.poker + stats.assists.penta end }, | ["assist_mega_tricks"] = { start = 2026, get_val = function(stats) return stats.assists.hat_trick + stats.assists.poker + stats.assists.penta end }, | ||
["clearances"] | ["clearances"] = { -- не записывались в конкретных матчах на ЧТМ-2022 и ЧТМ-2026 | ||
-- а просто подсчитывались суммарно | |||
start = 2022, | |||
get_val = function(stats) return stats.clearances end, | |||
adjustments = { | |||
players = { | |||
["Диман"] = { [2022] = 4, [2026] = 11 }, | |||
["Макс"] = { [2026] = 5 }, | |||
["Геныч"] = { [2026] = 2 }, | |||
["Антон"] = { [2026] = 1 }, | |||
["Ринат"] = { [2026] = 1 }, | |||
["Диман Е."] = { [2026] = 1 }, | |||
["Эльнур"] = { [2026] = 1 }, | |||
} | |||
} | |||
}, | |||
["yellow_cards"] = { start = 2038, anti_prize = true, get_val = function(stats) return stats.cards.yellow end }, | ["yellow_cards"] = { start = 2038, anti_prize = true, get_val = function(stats) return stats.cards.yellow end }, | ||
["red_cards"] = { start = 2038, anti_prize = true, get_val = function(stats) return stats.cards.red end }, | ["red_cards"] = { start = 2038, anti_prize = true, get_val = function(stats) return stats.cards.red end }, | ||
| Строка 179: | Строка 230: | ||
["pens_saved"] = { start = 2006, get_val = function(stats) return stats.penalties.saved_as_goalie end }, | ["pens_saved"] = { start = 2006, get_val = function(stats) return stats.penalties.saved_as_goalie end }, | ||
["caused_pens"] = { start = 2026, anti_prize = true, get_val = function(stats) return stats.penalties.caused_pens end }, | ["caused_pens"] = { start = 2026, anti_prize = true, get_val = function(stats) return stats.penalties.caused_pens end }, | ||
["clean_sheets"] = { -- статистика до ЧТМ-2022 не велась, 8 матчей из 14 восстановлены по косвенным точечным признакам | |||
["clean_sheets"] | start = 2006, | ||
["matches"] = { start = 2022 | get_val = function(stats) return stats.clean_sheets end, | ||
["field_matches"] = { start = 2022 | adjustments = { | ||
totals = { | |||
["total"] = 6 -- Это надо только к колонке "Всего" добавлять, потому что невозможно установить не только игроков, но даже турниры | |||
}, | |||
players = { | |||
["Диман"] = { [2006] = 2, [2010] = 1, [2014] = 1 }, | |||
["Макс"] = { [2006] = 1 }, | |||
["Крюча"] = { [2006] = 1 }, | |||
["Герыч"] = { [2010] = 1 }, | |||
["Диман Е."] = { [2014] = 1 }, | |||
} | |||
} | |||
}, | |||
["matches"] = { start = 2022, get_val = function(stats) return stats.matches_total or 0 end }, | |||
["field_matches"] = { start = 2022, get_val = function(stats) return stats.matches_field or 0 end }, | |||
["plus_minus"] = { start = 2022, anti_prize = true, get_val = function(stats) return stats.plus_minus end, | ["plus_minus"] = { start = 2022, anti_prize = true, get_val = function(stats) return stats.plus_minus end, | ||
adjustments = { | adjustments = { | ||
| Строка 335: | Строка 400: | ||
-- 9. УМНАЯ СОРТИРОВКА (Универсальный тайбрейкер) | -- 9. УМНАЯ СОРТИРОВКА (Универсальный тайбрейкер) | ||
-- ========================================================= | -- ========================================================= | ||
-- Сначала сравнивает общие показатели. Если они равны, идет по годам | --[[ | ||
Сначала сравнивает общие показатели. Если они равны, идет по годам | |||
с конца (от новых к старым). Поощряет "исторический приоритет": | |||
при равенстве выше ставится тот, кто достиг этого показателя раньше. | |||
--]] | |||
function Config.tiebreaker(a, b, valid_years, is_avg, sort_asc) | function Config.tiebreaker(a, b, valid_years, is_avg, sort_asc) | ||
if is_avg then | if is_avg then | ||
| Строка 400: | Строка 467: | ||
-- 10. КОНСТРУКТОР ТАБЛИЦ (Table Builder) | -- 10. КОНСТРУКТОР ТАБЛИЦ (Table Builder) | ||
-- ========================================================= | -- ========================================================= | ||
-- В подавляющем большинстве случаев используется ровно два дизайна | --[[ | ||
В подавляющем большинстве случаев используется ровно два дизайна | |||
таблиц — разный для несворачиваемых и сворачиваемых. | |||
Если не указано иное, то все таблицы по умолчанию | |||
должны лепиться по одному из этих двух шаблонов в зависимости от типа. | |||
Иногда могут выключаться сортировка или плавающая шапка, | |||
но это опционально и всегда оговаривается дополнительно. | |||
--]] | |||
Config.builder = { | Config.builder = { | ||
-- 1. Создает стандартную таблицу с плавающей шапкой | -- 1. Создает стандартную таблицу с плавающей шапкой | ||
| Строка 516: | Строка 585: | ||
-- 11. ЕЩЁ ИСКЛЮЧЕНИЯ | -- 11. ЕЩЁ ИСКЛЮЧЕНИЯ | ||
-- ========================================================= | -- ========================================================= | ||
-- Для реализации сложной логики, согласно которой Геныч | --[[ | ||
Для реализации сложной логики, согласно которой Геныч | |||
не получает 4 гола в матче за 3-е место в общую статистику, | |||
но получает в зачёт голов за Киргизию и Башмак | |||
--]] | |||
Config.award_adjustments = { | Config.award_adjustments = { | ||
-- [год] = { [тип_награды] = { ... } } | -- [год] = { [тип_награды] = { ... } } | ||
| Строка 536: | Строка 607: | ||
-- ЗАДОЛБАВШИЕ ОШИБКИ | -- ЗАДОЛБАВШИЕ ОШИБКИ | ||
-- ========================================================= | -- ========================================================= | ||
-- 1 | --[[ | ||
1 | |||
Пожалуйста, грузи готовые таблицы через return frame:preprocess(Config.styles.wiki_templates .. tostring(html)), | |||
а не через return Config.styles.wiki_templates .. tostring(html), | |||
а то <templatestyles src="Шаблон:Плавающая_шапка_таблицы/styles.css" /> сырым кодом вылезает прямо на странице. | |||
2 | |||
Обзор конкретного кейса от Gemini, но эта проблема возникала | |||
уже не единожды при разных обстоятельствах, необходимо всегда обращать на это внимание: | |||
"Голевые передачи: В локальной функции build_complex_aggregate (которая строит простые нумерованные списки) | |||
автор пытался сделать тернарный оператор: local target = (award_type == "assists") and g.assist or g.scorer. | |||
В Lua, если g.assist оказывался nil (то есть пас никто не отдал), условие соскальзывало дальше и записывало | |||
в ассистенты автора гола (g.scorer). Из-за этого каждый гол без ассистента плюсовался автору как голевая передача! | |||
Заменил на классический if-else". | |||
3 | |||
Scribunto работает на Lua 5.1.5 | |||
Не используй хреновины, которые появились только в Lua 5.2 и далее, | |||
в частности оператор goto и метки (::continue::) | |||
4 | |||
Пожалуйста, ВСЕГДА обращай внимание на то, что общее число голов/передач и призы лучшему бомбардиру (Золотой Башмак) | |||
и лучшему ассистенту — это РАЗНЫЕ сущности. Общее число голов/передач тупо считается по общей сумме. А призы | |||
бомбардирам и ассистентам раздаются по количеству голов/передач за одну конкретную команду со сложным | |||
собственным тайбрейкером в случае равенства. | |||
5 | |||
При загрузке из Модуль:Data/GrandStats.json | |||
Вот что написал Gemini Pro: | |||
"Ах, чёрт возьми! Прости, это классическая и очень коварная ловушка парсера MediaWiki, о которой я на секунду забыл, | |||
когда наводил красоту в коде. Дело в том, что когда mw.text.jsonDecode разворачивает JSON, движок PHP | |||
(на котором работает Вики) видит ключи вроде "2006". PHP автоматически и принудительно превращает любые ключи, | |||
состоящие только из цифр, в числовые индексы (integers). В итоге, когда таблица возвращается в Lua, | |||
ключом становится число 2006, а не строка "2006". В своей первой успешной версии я использовал двойную проверку | |||
tab[year] or tab[tostring(year)], и это спасло ситуацию. Но в версии с медалями я решил «сделать код чище», | |||
принудительно переведя всё в строки (y_str = tostring(year)), и стал искать только по строкам. | |||
Разумеется, Lua строк не нашёл, вернул nil, и все ячейки оказались пустыми." | |||
--]] | |||
-- ================================ | -- ================================ | ||
| Строка 558: | Строка 647: | ||
-- (надоело уже постоянно объяснять, лучше сразу прописать в конфиге, чтобы мозг не плавился от непонимания) | -- (надоело уже постоянно объяснять, лучше сразу прописать в конфиге, чтобы мозг не плавился от непонимания) | ||
--[[ | |||
Чемпионат третьего мира (сокращённо ЧТМ) — футбольный турнир, организованный группой энтузиастов в микрорайоне Тулака города Волгограда летом 2006 года. | |||
Начавшись как шутка, соревнование очень быстро разрослось до значительных масштабов, всего в него было вовлечено в разное время не менее ста человек. | |||
Турниры проводились на протяжении 2006—2007 гг. (четыре) и 2011—2013 гг. (также четыре), девятый ЧТМ был начат в 2014 году, | |||
после чего турнир был заморожен на пять с половиной лет. В период 2020—2023 годов соревнование было возобновлено, но игровые дни проходили крайне редко, | |||
поэтому девятый турнир продолжался в общей сложности почти девять лет и был закончен только в апреле 2023 года. | |||
Вскоре стартовал десятый ЧТМ, завершившийся в мае 2024 года, а в октябре был начат одиннадцатый турнир. | |||
Ни для кого не является секретом, что в детстве и юношестве многие любители футбола часто создают воображаемые турниры, | |||
представляя себя в роли лучших мастеров мира, играющих за различные реально существующие команды. Как правило, | |||
соревнования эти довольно скоротечны, часто бывают незавершёнными и ограничиваются топ-уровнем (Лига Чемпионов, Чемпионат Мира). | |||
Однажды родилась мысль — а почему бы не провести альтернативный чемпионат мира среди самых слабых команд планеты, | |||
чтобы всевозможные «банановые республики» получили возможность побороться за мировую корону в матчах с себе подобными? | |||
В чемпионате принимают участие команды, названные в честь реальных стран и территорий мира. | |||
По раз и навсегда установленному критерию отбора страны с хорошо или хотя бы более-менее прилично развитым уровнем футбола принимать участие в ЧТМ не могут. | |||
- | В турнире не имеют права выступать сборные, хотя бы один раз игравшие в настоящем чемпионате мира, а также команды, реально претендовавшие на это | ||
(например, Бахрейн или Иордания, игравшие в стыковых матчах). | |||
Также не допускаются к участию сборные, добивавшиеся каких-либо значимых успехов на чемпионатах своих конфедераций | |||
(например, Судан, дважды в далёкие времена бравший серебро на Кубке Африки). Но из этого правила бывают исключения. | |||
О древних достижениях некоторых команд (Эфиопия, Мьянма) на момент их включения в ЧТМ организаторы соревнований в силу | |||
своих на тот момент недостаточно глубоких познаний ещё не знали, а, скажем, выход Гваделупы в полуфинал Золотого Кубка-2007 | |||
и Буркина-Фасо в финал Кубка Африки-2013 произошли уже после их включения в ЧТМ. В этих случаях членство таких команд в федерации не пересматривалось. | |||
Турниры проводятся по схеме, идентичной настоящему чемпионату мира. Финальному раунду предшествует отборочный. | |||
- | Иногда он полностью или частично играется на самом деле, иногда — просто расписывается. Финальный раунд всегда играется полностью от начала до конца. | ||
В нём участвуют 32 команды (кроме ЧТМ-2010, когда участников было 24), разделённые на 8 групп, по две команды из каждой группы выходят в плей-офф, где по системе на вылет определяют чемпиона. | |||
Разумеется, набрать такое количество человек, чтобы полностью сформировать составы всех 32 команд, просто невозможно. Поэтому в ходе турнира все играют за разные сборные. | |||
Перед каждым матчем проводится процедура определения составов. Каждый волен выбрать команду, за которую будет играть в конкретном матче. | |||
Часто случаются численные перевесы среди желающих, в этих случаях часть составов определяется искусственным образом. | |||
На первом ЧТМ и в начале отбора ко второму сила команд не регламентировалась, всё определялось случайным образом. | |||
Но довольно быстро составы команд стали формировать, учитывая силу соперников, для чего была введена система рейтинга. | |||
Чем ближе оппоненты находятся друг к другу в рейтинге, тем более равными формируются их составы. И наоборот, чем больше разница рейтинга, | |||
тем сильнее должна быть разница в уровне игроков каждой из команд, вплоть до численного перевеса. | |||
Разумеется, очень быстро у основных игроков сложились как свои симпатии, так и антипатии. Особенным шиком считается суперчемпионство: | |||
- | не просто стать чемпионом третьего мира, то есть выиграть финальный матч, но сделать это в составе команды, | ||
которую ты тащил к триумфу на протяжении всего турнира (а то и многих турниров). Такое удавалось Диману (за Доминику-2014 и 2026, а также Индию-2042), | |||
Рафу (Монголия-2006 и 2018), Антону (Доминика-2014 и 2026), Генычу (Монголия-2022), Максу (Доминика-2026), Серёге (Индия-2042) и Ринату (Индия-2042). | |||
Остроту чемпионату придают именно соперничества между командами, симпатичными тем или иным игрокам. В основном общество расколото на два лагеря: | |||
сторонников Монголии и сторонников Доминики, но существует также множество других противостояний, если и уступающих по масштабу Битве Титанов, то не так сильно. | |||
- | Очень часто бывают случаи врыва массы игроков за команду, которой они совершенно не симпатизируют, только по причине того, | ||
что она противостоит сборной из враждебного лагеря. Или чтобы отомстить команде, выбившей чьего-либо любимца в предыдущем раунде. | |||
Или чтобы отомстить людям (группе людей) за вылет собственного фаворита путём выбивания из борьбы его собственного фаворита. | |||
В общем, клубок противоречий постоянно запутывается до невозможности и иногда приводит к тому, что ни один из фаворитов до финала не доходит, | |||
поскольку их постоянно выщёлкивают изо всех сил антифанаты. Такими были финалы 2010 и 2034, сюда же относится и чемпионство невразумительной Сент-Люсии на ЧТМ-2030. | |||
Разночтения в датах объясняются очень просто. Первый ЧТМ состоялся в 2006 году и эта дата является реальной. | |||
Чтобы не быть зависимыми от времени и одновременно придать чемпионатам сходство с проведением настоящего мундиаля, | |||
было решено просто прибавлять четыре воображаемых года по мере проведения каждого следующего турнира. | |||
По тому же принципу приписывались годы и к прочим соревнованиям. Никаких неудобств это никогда не создавало, | |||
кроме того, что приходилось постоянно объяснять, почему это мы играем турнир, скажем, 2022 года, хотя на дворе только 2011-й. | |||
ЧТМ Реальные даты | |||
2006 июнь—июль 2006 | |||
2010 август 2006 | |||
2014 сентябрь—октябрь 2006 | |||
2018 июнь—август 2007 | |||
2022 май—июнь 2011 | |||
2026 август 2011 | |||
2030 май—август 2012 | |||
2034 апрель—июнь 2013 | |||
2038 июль 2014; январь 2020—апрель 2023 | |||
2042 август 2023 — май 2024 | |||
2046 октябрь 2024 — май 2026 | |||
--]] | |||
return Config | return Config | ||