Модуль:Significance

Материал из ЧТМ
Версия от 16:03, 27 апреля 2026; Туалетный король (обсуждение | вклад) (Версия 0.1)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску
Документация Документация

Модуль значимости игроков. Работает как для искомой страницы, полностью её собирая, так и как чистый движок в составе других модулей.

Использование

{{#invoke:Significance|drawAll}}


Пожалуйста, добавляйте категории на страницу документации.

-- ==========================================
-- Модуль:Significance (Калькулятор Значимости ЧТМ)
-- Версия 0.1
-- ==========================================
local Significance = {}

local StatEngine = require('Module:StatEngine')
local Megarating = require('Module:Megarating')

-- Вспомогательная функция: Выводит галочку или крестик
local function mark(condition)
    return condition and '<span style="color:green;">✅ Да</span>' or '<span style="color:red;">❌ Нет</span>'
end

-- ==========================================
-- ЯДРО ЛОГИКИ: ОЦЕНКА ОДНОГО ИГРОКА
-- Возвращает: Уровень (string), Лог проверок (string)
-- ==========================================
function Significance.evaluate_player(p_stats, mr_data)
    local logs = {}
    local function log_cat(title) table.insert(logs, "\n=== " .. title .. " ===") end
    local function log_item(text) table.insert(logs, text) end

    -- СБОР ДОСЬЕ ИГРОКА
    local aw = p_stats.awards or {}
    local mr = p_stats.megarating or {}
    
    local gold_spheres = aw.golden_spheres or 0
    local titles = aw.titles or 0
    local superchamps = aw.superchamps or 0
    local goals = p_stats.goals.total or 0
    local assists = p_stats.assists.total or 0
    local mvps = p_stats.mvp.is_mvp or 0
    
    local finals_goals = mr.final_goals or 0
    local finals_assists = mr.final_assists or 0
    local finals_played = aw.finals_played or 0
    
    -- Сумма призов (согласно правилам: Шары кроме золотого + любые Башмаки + Вратарь)
    local sum_awards = (aw.other_spheres or 0) + (aw.golden_boots or 0) + (aw.other_boots or 0) + (aw.best_goalies or 0)
    local any_award_exist = (sum_awards > 0) or (gold_spheres > 0)
    
    -- Данные из кэша Мегарейтинга
    local top5 = mr_data and mr_data.top5 or 0
    local top10 = mr_data and mr_data.top10 or 0
    
    -- Считаем количество сыгранных турниров (проверяем ключи в таблице years из GrandStats)
    local tournaments_played = 0
    if p_stats.years then
        for _, _ in pairs(p_stats.years) do tournaments_played = tournaments_played + 1 end
    end
    
    local matches = p_stats.matches_total or 0

    log_cat("ДОСЬЕ: " .. p_stats.name)
    log_item("Турниров: " .. tournaments_played .. " | Матчей: " .. matches .. " | Финалов: " .. finals_played)
    log_item("Голы: " .. goals .. " (в финалах: " .. finals_goals .. ")")
    log_item("Ассисты: " .. assists .. " (в финалах: " .. finals_assists .. ")")
    log_item("MVP: " .. mvps)
    log_item("Титулы: " .. titles .. " | Суперчемпионства: " .. superchamps)
    log_item("Золотых шаров: " .. gold_spheres .. " | Других призов (для суммы): " .. sum_awards)
    log_item("В топ-5: " .. top5 .. " | В топ-10: " .. top10)

    -- ==========================================
    -- 1. МАКСИМАЛЬНАЯ ЗНАЧИМОСТЬ
    -- ==========================================
    log_cat("Проверка: Максимальная")
    local m_c1 = (gold_spheres >= 1); log_item(mark(m_c1) .. " 1. Обязательно: Минимум один Золотой Шар")
    local m_c2 = (titles >= 2 or superchamps >= 1); log_item(mark(m_c2) .. " 2. Минимум два титула или одно суперчемпионство")
    local m_c3 = (goals >= 75 or assists >= 50 or mvps >= 20); log_item(mark(m_c3) .. " 3. Голы >= 75 ИЛИ ассисты >= 50 ИЛИ MVP >= 20")
    local m_c4 = (finals_goals >= 2 or finals_assists >= 3 or finals_played >= 4); log_item(mark(m_c4) .. " 4. В финале: голы >= 2 ИЛИ ассисты >= 3 ИЛИ сыграно финалов >= 4")
    local m_c5 = (sum_awards >= 4); log_item(mark(m_c5) .. " 5. Минимум 4 любых Шара (кр. золотого), Башмака или Вратаря")
    local m_c6 = (top5 >= 2 or top10 >= 4); log_item(mark(m_c6) .. " 6. Мегарейтинг: топ-5 >= 2 ИЛИ топ-10 >= 4")
    
    local m_score = (m_c1 and 1 or 0) + (m_c2 and 1 or 0) + (m_c3 and 1 or 0) + (m_c4 and 1 or 0) + (m_c5 and 1 or 0) + (m_c6 and 1 or 0)
    log_item("Итого критериев: " .. m_score .. "/6")
    
    if m_c1 and m_score >= 4 then
        return "Максимальная", table.concat(logs, "\n")
    end

    -- ==========================================
    -- 2. ВЫСОКАЯ ЗНАЧИМОСТЬ
    -- ==========================================
    log_cat("Проверка: Высокая")
    local h_c1 = any_award_exist; log_item(mark(h_c1) .. " 1. Минимум один любой Шар, Башмак или титул лучшего вратаря")
    local h_c2 = (titles >= 1); log_item(mark(h_c2) .. " 2. Завоёван хотя бы один титул")
    local h_c3 = (goals >= 40 or assists >= 25 or mvps >= 10); log_item(mark(h_c3) .. " 3. Голы >= 40 ИЛИ ассисты >= 25 ИЛИ MVP >= 10")
    local h_c4 = (finals_goals >= 1 or finals_assists >= 2 or finals_played >= 3); log_item(mark(h_c4) .. " 4. В финале: голы >= 1 ИЛИ ассисты >= 2 ИЛИ сыграно финалов >= 3")
    local h_c5 = (tournaments_played >= 6); log_item(mark(h_c5) .. " 5. Участие минимум в 6 турнирах")
    local h_c6 = (top5 >= 1 or top10 >= 3); log_item(mark(h_c6) .. " 6. Мегарейтинг: топ-5 >= 1 ИЛИ топ-10 >= 3")
    
    local h_score = (h_c1 and 1 or 0) + (h_c2 and 1 or 0) + (h_c3 and 1 or 0) + (h_c4 and 1 or 0) + (h_c5 and 1 or 0) + (h_c6 and 1 or 0)
    log_item("Итого критериев: " .. h_score .. "/6")
    
    if h_score >= 4 then
        return "Высокая", table.concat(logs, "\n")
    end

    -- ==========================================
    -- 3. СРЕДНЯЯ ЗНАЧИМОСТЬ
    -- ==========================================
    log_cat("Проверка: Средняя")
    local a_c1 = any_award_exist; log_item(mark(a_c1) .. " 1. Минимум один любой Шар, Башмак или титул лучшего вратаря")
    local a_c2 = (titles >= 1); log_item(mark(a_c2) .. " 2. Завоёван хотя бы один титул")
    local a_c3 = (goals >= 20 or assists >= 15 or mvps >= 5); log_item(mark(a_c3) .. " 3. Голы >= 20 ИЛИ ассисты >= 15 ИЛИ MVP >= 5")
    local a_c4 = (finals_goals >= 1 or finals_assists >= 2 or finals_played >= 3); log_item(mark(a_c4) .. " 4. В финале: голы >= 1 ИЛИ ассисты >= 2 ИЛИ сыграно финалов >= 3")
    local a_c5 = (tournaments_played >= 4); log_item(mark(a_c5) .. " 5. Участие минимум в 4 турнирах")
    local a_c6 = (top5 >= 1 or top10 >= 2); log_item(mark(a_c6) .. " 6. Мегарейтинг: топ-5 >= 1 ИЛИ топ-10 >= 2")
    
    local a_score = (a_c1 and 1 or 0) + (a_c2 and 1 or 0) + (a_c3 and 1 or 0) + (a_c4 and 1 or 0) + (a_c5 and 1 or 0) + (a_c6 and 1 or 0)
    log_item("Итого критериев: " .. a_score .. "/6")
    
    if a_score >= 2 then
        return "Средняя", table.concat(logs, "\n")
    end

    -- ==========================================
    -- 4. НИЖЕ СРЕДНЕГО
    -- ==========================================
    log_cat("Проверка: Ниже среднего")
    local b_m1 = (goals >= 10); local b_s1 = (goals >= 5); log_item("1. Голы: " .. mark(b_m1) .. " осн (>=10) | " .. mark(b_s1) .. " доп (>=5)")
    local b_m2 = (titles >= 1 or finals_played >= 2); local b_s2 = (finals_played >= 1); log_item("2. Титул или Финалы: " .. mark(b_m2) .. " осн (титул/финалы>=2) | " .. mark(b_s2) .. " доп (финалы>=1)")
    local b_m3 = (tournaments_played >= 3); local b_s3 = (tournaments_played >= 2); log_item("3. Турниры: " .. mark(b_m3) .. " осн (>=3) | " .. mark(b_s3) .. " доп (>=2)")
    local b_m4 = (mvps >= 3); local b_s4 = (mvps >= 2); log_item("4. MVP: " .. mark(b_m4) .. " осн (>=3) | " .. mark(b_s4) .. " доп (>=2)")
    local b_m5 = (assists >= 8); local b_s5 = (assists >= 4); log_item("5. Ассисты: " .. mark(b_m5) .. " осн (>=8) | " .. mark(b_s5) .. " доп (>=4)")
    local b_m6 = (finals_goals >= 1 or finals_assists >= 1); log_item("6. В финале гол или пас: " .. mark(b_m6) .. " осн")
    local b_m7 = (top10 >= 1); log_item("7. Мегарейтинг Топ-10: " .. mark(b_m7) .. " осн")
    
    local main_score = (b_m1 and 1 or 0) + (b_m2 and 1 or 0) + (b_m3 and 1 or 0) + (b_m4 and 1 or 0) + (b_m5 and 1 or 0) + (b_m6 and 1 or 0) + (b_m7 and 1 or 0)
    local sub_score = (b_s1 and 1 or 0) + (b_s2 and 1 or 0) + (b_s3 and 1 or 0) + (b_s4 and 1 or 0) + (b_s5 and 1 or 0)
    log_item("Итого: Основных: " .. main_score .. ", Дополнительных: " .. sub_score)
    
    if main_score >= 1 or sub_score >= 2 then
        return "Ниже среднего", table.concat(logs, "\n")
    end

    -- ==========================================
    -- 5. НИЗКАЯ ЗНАЧИМОСТЬ
    -- ==========================================
    log_cat("Проверка: Низкая")
    local l_c1 = (goals >= 1); log_item(mark(l_c1) .. " 1. Забит хотя бы 1 гол")
    local l_c2 = (finals_played >= 1); log_item(mark(l_c2) .. " 2. Участие в финале")
    local l_c3 = (tournaments_played >= 3); log_item(mark(l_c3) .. " 3. Участие в 3 турнирах")
    local l_c4 = (mvps >= 1); log_item(mark(l_c4) .. " 4. Признание MVP")
    local l_c5 = (assists >= 2); log_item(mark(l_c5) .. " 5. Ассисты >= 2")
    local l_c6 = (matches >= 10); log_item(mark(l_c6) .. " 6. Сыграно >= 10 матчей")
    
    local l_score = (l_c1 and 1 or 0) + (l_c2 and 1 or 0) + (l_c3 and 1 or 0) + (l_c4 and 1 or 0) + (l_c5 and 1 or 0) + (l_c6 and 1 or 0)
    log_item("Итого критериев: " .. l_score)
    
    if l_score >= 1 then
        return "Низкая", table.concat(logs, "\n")
    end

    -- ==========================================
    -- 6. СЛУЧАЙНЫЙ ПРОХОЖИЙ
    -- ==========================================
    log_cat("Проверка: Случайный прохожий")
    log_item("Не выполнил ни одного критерия низкого уровня.")
    return "Случайный прохожий", table.concat(logs, "\n")
end

-- ==========================================
-- ОТЛАДОЧНЫЙ ВЫВОД ДЛЯ СТРАНИЦЫ WIKI (Тестирование)
-- Вызов: {{#invoke:Significance|test_player|player=Диман}}
-- ==========================================
function Significance.test_player(frame)
    local target_player = frame.args.player or "Диман"
    
    -- 1. Получаем глобальную стату (БД прогружается из кэша Lua один раз)
    local grand_stats = StatEngine.Harvester.run_all_time({need_players = true, keep_years = true})
    
    -- 2. Получаем историю мест в Мегарейтинге
    local mr_history = Megarating.get_public_history()
    
    -- 3. Находим игрока
    local p_stats = grand_stats.Players[target_player]
    if not p_stats then return "Игрок '" .. target_player .. "' не найден в БД." end
    
    local mr_data = mr_history.players[target_player]
    
    -- 4. Запускаем калькулятор
    local level, log_text = Significance.evaluate_player(p_stats, mr_data)
    
    -- 5. Возвращаем красивый сырой текст
    local result = "== Результат оценки: " .. target_player .. " ==\n"
    result = result .. "'''Присвоенный уровень: " .. level .. "'''\n\n"
    result = result .. log_text
    
    return frame:preprocess(result)
end

return Significance