This commit is contained in:
2026-06-24 10:27:15 -05:00
parent 4dc88f8e0f
commit 253b8cfbcd
2 changed files with 63 additions and 14 deletions

View File

@@ -130,10 +130,15 @@ function sideFrom(
}
// Baut die komplette aufgelöste Bracket-Struktur.
// resolveWinners: wenn true, werden die Gewinner-TeamIDs aus den aufgelösten
// R32-Slots abgeleitet (basierend auf den Spiel-Scores), statt aus den Team-IDs
// des Feeds. Nötig für die Simulation, wo KO-Matches Scores aber keine Team-IDs
// im Feed haben.
export function resolveBracket(
matches: Match[], teams: Team[], tables: GroupTable[],
thirds: ThirdPlaceRow[], assignment: ThirdAssignment | null,
annexResolved: boolean,
resolveWinners = false,
): { r32: ResolvedTie[]; later: Record<number, ResolvedTie> } {
// Map: Match-Nummer -> Sieger-Team-ID (für Propagation in Folgerunden)
const winners = new Map<number, string | null>();
@@ -153,8 +158,25 @@ export function resolveBracket(
const home = sideFrom(h.teamId, slotLabel(rm.home, assignment, winnerGroup), teams, feed, "home", h.provisional, h.tooltip);
const away = sideFrom(a.teamId, slotLabel(rm.away, assignment, winnerGroup), teams, feed, "away", a.provisional, a.tooltip);
winners.set(rm.matchNumber, winnerOf(feed));
losers.set(rm.matchNumber, loserOf(feed));
const feedWinner = winnerOf(feed);
if (resolveWinners && !feedWinner && feed && h.teamId && a.teamId
&& feed.homeScore != null && feed.awayScore != null) {
// Simulation: Gewinner aus Scores und aufgelösten Team-IDs ableiten
if (feed.homeScore > feed.awayScore) {
winners.set(rm.matchNumber, h.teamId);
losers.set(rm.matchNumber, loserOf(feed) ?? a.teamId);
} else if (feed.awayScore > feed.homeScore) {
winners.set(rm.matchNumber, a.teamId);
losers.set(rm.matchNumber, loserOf(feed) ?? h.teamId);
} else {
// Unentschieden → Heim gewinnt
winners.set(rm.matchNumber, h.teamId);
losers.set(rm.matchNumber, loserOf(feed) ?? a.teamId);
}
} else {
winners.set(rm.matchNumber, feedWinner);
losers.set(rm.matchNumber, loserOf(feed));
}
decided.set(rm.matchNumber, feed?.status === "FINISHED");
return {
matchNumber: rm.matchNumber, stage: "R32",
@@ -177,8 +199,24 @@ export function resolveBracket(
const awayTtip = `${km.losers ? "Verlierer" : "Sieger"} aus Spiel ${km.fromAway}`;
const home = sideFrom(homeId, homeLabel, teams, feed, "home", homeProv, homeTtip);
const away = sideFrom(awayId, awayLabel, teams, feed, "away", awayProv, awayTtip);
winners.set(km.matchNumber, winnerOf(feed));
losers.set(km.matchNumber, loserOf(feed));
const feedWinner = winnerOf(feed);
if (resolveWinners && !feedWinner && feed && homeId && awayId
&& feed.homeScore != null && feed.awayScore != null) {
if (feed.homeScore > feed.awayScore) {
winners.set(km.matchNumber, homeId);
losers.set(km.matchNumber, loserOf(feed) ?? awayId);
} else if (feed.awayScore > feed.homeScore) {
winners.set(km.matchNumber, awayId);
losers.set(km.matchNumber, loserOf(feed) ?? homeId);
} else {
winners.set(km.matchNumber, homeId);
losers.set(km.matchNumber, loserOf(feed) ?? awayId);
}
} else {
winners.set(km.matchNumber, feedWinner);
losers.set(km.matchNumber, loserOf(feed));
}
decided.set(km.matchNumber, feed?.status === "FINISHED");
later[km.matchNumber] = {
matchNumber: km.matchNumber, stage: km.stage,