尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Самодокументирующий README для GitHub. Полная внутренняя версия:
../МЕТОДОЛОГИЯ_new_ce634_v1.0.md. Обновлять при существенных изменениях. Эталон «new»/мобильной версии —ce634.html.
Статический сайт статистики мафия-турниров. Без сборки (no build): чистые HTML+CSS+JS. Прод — Vercel (mafgamestat.vercel.app). Каждый турнир имеет id (напр. 634 = Чемпионат Европы 2026).
Два вида страниц турнира:
tournament.html, participants.html, seating{id}.html, cards{id}.html, standings.html, results.html, roles.html, player.html). Десктоп-ориентированы.ce{id}.html (эталон ce634.html). Мобайл-фёрст, esports-раскладка, всё в одном файле поверх ТЕХ ЖЕ данных.site/)index.html хаб турниров (список, статусы, постеры)
tournament.html страница турнира (?t=id) — меню разделов классики
participants.html состав + рейтинг markery (универсальная, ?t=id)
seating{id}.html интерактивная рассадка (классика)
cards{id}.html карточки игроков (классика)
standings.html сводная (?t=id) · roles.html (?t=id) · results.html · player.html
ce{id}.html «new»/мобильная версия (эталон ce634.html)
data/
tournaments.js РЕЕСТР всех турниров (статусы, постеры, accent, разделы, порядок)
live.js LIVE-движок: тянет игры с mafgame через прокси /mafgame/*, парсит, защищает снимок
streams.js ссылки на трансляции
tournament_{id}.json мета турнира (in_progress, games_total, prize_eur, stars, accent, referees, format)
participants_{id}.json ростер + рейтинг markery (nick,uid,real,av,status,markery_id,ms,r_tier,r_elo_cur,r_elo_2026,r_rank_eu_2026)
avatars_{id}.json {avatars:{nick:url}, judges:{"1":{name,tg,avatar},...}}
elo_{id}.json {players:{nick:{global,tournaments}}}
skip_{id}.json {nick: номер игры отдыха}
games_{id}_current.json {games:[{title,stage,tables:[{table_num,judge,winner,seats:[{seat,name,role,marker,aps,wpts,ci,result}]}]}]}
_snapshots/ снимки рейтинга markery по датам
assets/ постеры (bonn{id}.jpg — широкий, bonn{id}_card.jpg — 16:9 для hero), фавикон
vercel.json rewrite /mafgame/:path* -> https://mafgame.org/:path* (прокси для live)
tournaments.js (window.TOURNAMENTS_DB.tournaments[]) — что за турниры, статусы, постеры, accent, разделы.data/ (см. выше).tournament_{id}.json.in_progress===true, live.js loadGames(id) при каждом открытии тянет /mafgame/tournaments/{id}/game_results (Vercel проксирует на mafgame.org), парсит Inertia-данные (convertInertia), сравнивает с сохранённым в localStorage снимком и не затирает хорошие данные пустыми (snapScore/notRegression). До старта / для завершённых — отдаёт локальный games_{id}_current.json.results mafgame (red_win/black_win), не из очков.Источники: mafgame.org (ростер uid, протоколы, рассадка, результаты — HTML Inertia), markery.online (ELO/тиры/места — ведём через Excel-базу, снимок в _snapshots/), mafiastats.com (REST, сверка).
ce634.html)Загрузчик → объект D → computeSeating()+computeStats() → NAV (4 группы) строит sidebar(desktop)/tabbar(mobile) → RENDER[section]()+afterRender().
@media(max-width:1024px) (ловит и раскрытый Fold). Таб-бар снизу, всплывающее меню, тумблер Компактно/Подробно, залипший ник.statFull (Компактно/Подробно), myPlayer+viewMode (localStorage), демо-режим (makeDemo — полный случайный бракет для проверки статы до старта).Статус задаётся в tournaments.js (status) + флаг in_progress в tournament_{id}.json. Порядок на главной — поле phase.
status:"gathering", phase:4, in_progress:false. Показываем анонс/заявки.status:"upcoming", phase:3. Доступны рассадка/карточки/участники; игр ещё нет. in_progress:false до дня старта.tournament_{id}.json.in_progress:true, status:"live", phase:2. live.js при каждом открытии подтягивает game_results через прокси.
in_progress:true постоянно (лишняя нагрузка на mafgame + риск подтянуть кривое/пустое). Включаем на дни турнира, после — выключаем.in_progress:false, status:"finished", phase:1. Данные заморожены, турнир уходит в архив (главная сортирует по дате start).tournament_{id}.json → standings (total/final/qualification), awards, чемпион/подиум. Сверить с сайтом mafgame до цента — итог и расшифровка обязаны биться.games_{id}_current.json (роли, очки, победители столов) как есть на конец турнира.tournament_{id}.json.in_progress:false; в tournaments.js status:"finished", phase:1.tournament_{id}.json.final_coef (напр. 1.3) — live.js (v2.1) умножает баллы стадии «Финал» на лету, а при заморозке коэффициент вшивается в games_{id}_current.json. Сверка 694: квалификация 30/30 и финал 10/10 — 1:1. Для завершённых источник истины — всё равно таблица mafgame.data/*_{newid}* (participants/tournament/avatars/elo/skip/games_current) по схемам выше. Добавить запись в tournaments.js.ce634.html → ce{newid}.html, заменить 634→{newid}, тексты (название/город/даты), START-дату, постер assets/*_card.jpg (16:9).stagesPanel() и группировку селектора игр (День/стадии) под реальный формат. Число игр — из данных, не хардкод.tournament.html?t={newid} (условие по t.id).cd site
zip -r ../Uploaded/mafgamestat_vN_upload.zip . \
-x "_Архив/*" -x "data/_snapshots/*" -x "SPEC.md" -x "*.DS_Store" -x "*.bak" -x "* *"
→ содержимое залить в GitHub (github.com/ValeriiScz/bitvachempionov2026) → Vercel автодеплой. Zip кладёт содержимое site/ в корень (без префикса). Перед сборкой zip: поднять CACHE_VERSION в sw.js (иначе у установивших PWA код обновится только со 2-го открытия).
.seatgrid/сетки: repeat(N,minmax(0,1fr)) + min-width:0 — иначе min-content колонок вылезает.live.js (localStorage snapScore/notRegression) — она бережёт данные при глюках mafgame._Архив/.node --check / jsdom-прогон (проверять кликами, не только вызовом функций), баланс {} в CSS, десктоп-скриншот.Сайт устанавливается как приложение: manifest.json (standalone, палитра Bonn) + sw.js (service worker) + иконки assets/icons/ (эмблема mafgame внутри чемпионского кубка, золото на navy; any/maskable 192/512 + apple-touch-icon 180) + PWA-блок в <head> всех страниц (манифест, theme-color, iOS-меты, регистрация SW — только по http(s), локальный file:// просмотр не падает) + промо-плашка установки на всех страницах: iPhone — инструкция Safari→«На экран “Домой”», Android — кнопка «Установить» (beforeinstallprompt) или инструкция про меню Chrome; не показывается внутри установленного приложения и 14 дней после «Позже» (localStorage mgs_pwa_promo_hide_until).
Стратегии кэша (sw.js):
/mafgame/* — только сеть (кэш обходится): live всегда свежий, защита снимка в live.js не задета;data/*.json — network-first (офлайн — из кэша);⚠️ При каждом деплое поднять CACHE_VERSION в sw.js (…-v12.1, …-v13) — на activate старые кэши удаляются. Установка: iPhone — Safari → Поделиться → «На экран "Домой"»; Android — Chrome → меню ⋮ → «Установить приложение». Полноэкранный standalone-запуск заодно навсегда лечит баг «Версии для ПК».
Нативное приложение (Swift/Kotlin) — избыточно: та же зависимость от mafgame, магазины, поддержка.