188 build - Delay Penalty починин

This commit is contained in:
2026-10-02 16:01:16 +03:00
parent 5a0b1e1ce8
commit 74249d7fa2
3 changed files with 44 additions and 15 deletions

37
README_BUILD188_RU.txt Normal file
View File

@@ -0,0 +1,37 @@
BUILD188 — 2026.10.02.8
Возврат прежнего вызова удалений при выданном верхнем счёте
Установка поверх BUILD187 (2026.10.02.7).
В архиве только два изменённых файла приложения и эта инструкция:
app.py
ui_builder/static/app.js
1. Остановите сервер.
2. Замените файлы, сохранив пути внутри проекта.
3. Запустите сервер и обновите браузер через Ctrl+F5.
Версия /api/health: 2026.10.02.8.
Исправление
В BUILD186 проверка занятости Overlay могла блокировать показ нового удаления,
когда верхний счёт уже был выдан. Обычная функция вызова удалений полностью
возвращена к рабочему коду до BUILD186: прежние команды native Countdown и
OverlayInputNIn выполняются по прежним условиям. Правила показа большинства,
настройки Input и события веб-таймеров используются как раньше.
Узкое исправление снятия Delay Penalty сохранено: если удаление ещё действует,
его плашка сохраняется на общем Input или возвращается на освобождённый Overlay.
При этом работающий таймер не перезапускается, а завершённое удаление не возвращается.
Изменения вкладки «Буллиты» из BUILD187 сохранены.
Для восстановления обычного вызова удалений дополнительные изменения настроек
шорткатов и сценариев не требуются.
Проверка после установки
1. Выдать верхний счёт и добавить новое удаление: плашка должна вызываться как раньше.
2. При действующем удалении включить и снять Delay Penalty: плашка удаления/
большинства должна остаться или вернуться, а таймер продолжить работу.
При подготовке проверены вызов новых удалений при живом верхнем счёте,
восстановление плашки после DP OFF, общий Input, сохранение native таймеров,
снятие последней карточки и подстановка Value в SelectedName.
Проверки выполнены в браузере с имитацией vMix; реальный vMix не подключался.

2
app.py
View File

@@ -35,7 +35,7 @@ from khl_site.khl_data_center import APP as khl_site_app, configure_storage, syn
from hockey_data.khl_career import KhlCareerService
BASE_DIR = Path(__file__).resolve().parent
BUILD_VERSION = "2026.10.02.7"
BUILD_VERSION = "2026.10.02.8"
# compatibility: BUILD_VERSION = "2026.09.24.2"
# compatibility: BUILD_VERSION = "2026.09.23.8"
# compatibility: BUILD_VERSION = "2026.09.23.7"

View File

@@ -5541,7 +5541,6 @@ function startCustomTooltips() {
// Overlay OUT operates on a layer. Do not remove an unrelated title that
// has since replaced this penalty Input on that layer.
const current = state.vmixOverlayRuntime.get(overlay);
if (hockeyTeamStateOverlayLayerWanted(overlay)) return;
if (current && runtimeOverlayInputRefs(current).size && !runtimeOverlayMatchesInput(current, input)) return;
const functionName = `OverlayInput${overlay}Out`;
if (!outCommands.some((command) => command.Function === functionName)) {
@@ -5572,7 +5571,6 @@ function startCustomTooltips() {
const eventKey = penaltyMirrorKey(entry.component, entry.event);
const sourceSide = String(entry.side || entry.event?.side || entry.event?.player?.side || side);
const overlay = ["1", "2", "3", "4", "5", "6", "7", "8"].includes(String(target.overlay || "")) ? String(target.overlay) : "2";
const reservedForTeamState = hockeyTeamStateOverlayLayerWanted(overlay);
const assignmentChanged = !previous
|| previous.eventKey !== eventKey
|| String(previous.input || "") !== String(target.input)
@@ -5586,7 +5584,7 @@ function startCustomTooltips() {
state.vmixPenaltyMirrors.delete(eventKey);
state.vmixPenaltyTargetAssignments.set(assignmentKey, {
eventKey, input: target.input, selectedName: target.selected_name, overlay, sourceSide, targetSide: side,
mode: "countdown", running: Boolean(entry.event.running), visible: scoreboardLive && !reservedForTeamState,
mode: "countdown", running: Boolean(entry.event.running), visible: scoreboardLive,
});
const explicitEdit = editedEventKey === eventKey;
const reseed = assignmentChanged || explicitEdit || (force && !editedEventKey && !preservePausedCountdown);
@@ -5618,20 +5616,14 @@ function startCustomTooltips() {
}
}
if (scoreboardLive && !reservedForTeamState) {
const current = state.vmixOverlayRuntime.get(overlay);
const targetWasVisible = !forceOverlay && (current && runtimeOverlayInputRefs(current).size
? runtimeOverlayMatchesInput(current, target.input)
: previous?.visible === true && Boolean(previous?.input) && String(previous.input) === String(target.input)
&& String(previous.overlay || overlay) === overlay);
if (scoreboardLive) {
const targetWasVisible = !forceOverlay && previous?.visible === true && Boolean(previous?.input)
&& String(previous.input) === String(target.input)
&& String(previous.overlay || overlay) === overlay;
if (!targetWasVisible) {
if (previous?.input && (String(previous.input) !== String(target.input) || String(previous.overlay || overlay) !== overlay)) {
const previousOverlay = ["1", "2", "3", "4", "5", "6", "7", "8"].includes(String(previous.overlay || "")) ? String(previous.overlay) : overlay;
const previousCurrent = state.vmixOverlayRuntime.get(previousOverlay);
if (!hockeyTeamStateOverlayLayerWanted(previousOverlay) && (!previousCurrent || !runtimeOverlayInputRefs(previousCurrent).size
|| runtimeOverlayMatchesInput(previousCurrent, previous.input))) {
outCommands.push({ Function: `OverlayInput${previousOverlay}Out`, Input: previous.input });
}
outCommands.push({ Function: `OverlayInput${previousOverlay}Out`, Input: previous.input });
}
inCommands.push({ Function: `OverlayInput${overlay}In`, Input: target.input });
}